@tempest/core
Version:
The core of the Tempest Stream Library
76 lines • 2.27 kB
JavaScript
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