UNPKG

@tempest/core

Version:

The core of the Tempest Stream Library

76 lines 2.27 kB
import { PredeterminedTask } from './PredeterminedTask'; import { runScheduledTask } from '../util/task'; export class TaskScheduler { constructor(timer, timeline) { this.timer = timer; this.timeline = timeline; this._timer = null; this._nextArrival = Infinity; const self = this; this._runReadyTasksBound = () => self._runReadyTasks(self.now()); } now() { return this.timer.now(); } asap(task) { return this.schedule(0, -1, task); } delay(delay, task) { return this.schedule(delay, -1, task); } periodic(period, task) { return this.schedule(0, period, task); } schedule(delay, period, task) { const time = this.now(); const st = new PredeterminedTask(+(time) + Math.max(0, delay), period, task, this); this.timeline.add(st); this._scheduleNextRun(+(time)); return st; } cancel(task) { task.active = false; if (this.timeline.remove(task)) { this._reschedule(); } } cancelAll(f) { this.timeline.removeAll(f); this._reschedule(); } _reschedule() { if (this.timeline.isEmpty()) { this._unschedule(); } else { this._scheduleNextRun(this.now()); } } _unschedule() { this.timer.clearTimer(this._timer); this._timer = null; } _scheduleNextRun(time) { if (this.timeline.isEmpty()) return; const nextArrival = this.timeline.nextArrival(); if (this._timer === null) { this._scheduleNextArrival(nextArrival, time); } else if (nextArrival < this._nextArrival) { this._unschedule(); this._scheduleNextArrival(nextArrival, time); } } _scheduleNextArrival(nextArrival, time) { this._nextArrival = nextArrival; const delay = Math.max(0, nextArrival - time); this._timer = this.timer.setTimer(this._runReadyTasksBound, delay); } _runReadyTasks(time) { this._timer = null; this.timeline.runTasks(time, runScheduledTask); this._scheduleNextRun(this.now()); } } //# sourceMappingURL=Scheduler.js.map