/*
 * See example/counting.html
 */

Zone['countingZoneSpec'] = {
  name: 'counterZone',
  // setTimeout
  onScheduleTask: function (delegate, current, target, task) {
    this.data.count += 1;
    delegate.scheduleTask(target, task);
  },

  // fires when...
  // - clearTimeout
  // - setTimeout finishes
  onInvokeTask: function (delegate, current, target, task, applyThis, applyArgs) {
    delegate.invokeTask(target, task, applyThis, applyArgs);
    this.data.count -= 1;
  },

  onHasTask: function (delegate, current, target, hasTask) {
    if (this.data.count === 0 && !this.data.flushed) {
      this.data.flushed = true;
      target.run(this.onFlush);
    }
  },

  counter: function () {
    return this.data.count;
  },

  data: {count: 0, flushed: false},

  onFlush: function () {},
};
