'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Scheduler; var _ScheduledTask = require('./ScheduledTask'); var _ScheduledTask2 = _interopRequireDefault(_ScheduledTask); var _task = require('../task'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** @license MIT License (c) copyright 2010-2016 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ function Scheduler(timer, timeline) { this.timer = timer; this.timeline = timeline; this._timer = null; this._nextArrival = Infinity; var self = this; this._runReadyTasksBound = function () { self._runReadyTasks(self.now()); }; } Scheduler.prototype.now = function () { return this.timer.now(); }; Scheduler.prototype.asap = function (task) { return this.schedule(0, -1, task); }; Scheduler.prototype.delay = function (delay, task) { return this.schedule(delay, -1, task); }; Scheduler.prototype.periodic = function (period, task) { return this.schedule(0, period, task); }; Scheduler.prototype.schedule = function (delay, period, task) { var now = this.now(); var st = new _ScheduledTask2.default(now + Math.max(0, delay), period, task, this); this.timeline.add(st); this._scheduleNextRun(now); return st; }; Scheduler.prototype.cancel = function (task) { task.active = false; if (this.timeline.remove(task)) { this._reschedule(); } }; Scheduler.prototype.cancelAll = function (f) { this.timeline.removeAll(f); this._reschedule(); }; Scheduler.prototype._reschedule = function () { if (this.timeline.isEmpty()) { this._unschedule(); } else { this._scheduleNextRun(this.now()); } }; Scheduler.prototype._unschedule = function () { this.timer.clearTimer(this._timer); this._timer = null; }; Scheduler.prototype._scheduleNextRun = function (now) { // eslint-disable-line complexity if (this.timeline.isEmpty()) { return; } var nextArrival = this.timeline.nextArrival(); if (this._timer === null) { this._scheduleNextArrival(nextArrival, now); } else if (nextArrival < this._nextArrival) { this._unschedule(); this._scheduleNextArrival(nextArrival, now); } }; Scheduler.prototype._scheduleNextArrival = function (nextArrival, now) { this._nextArrival = nextArrival; var delay = Math.max(0, nextArrival - now); this._timer = this.timer.setTimer(this._runReadyTasksBound, delay); }; Scheduler.prototype._runReadyTasks = function (now) { this._timer = null; this.timeline.runTasks(now, _task.runTask); this._scheduleNextRun(this.now()); };