119 lines
3.9 KiB
JavaScript
119 lines
3.9 KiB
JavaScript
"use strict";
|
|
var __extends = (this && this.__extends) || function (d, b) {
|
|
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
var Subscription_1 = require('../Subscription');
|
|
var VirtualTimeScheduler = (function () {
|
|
function VirtualTimeScheduler() {
|
|
this.actions = [];
|
|
this.active = false;
|
|
this.scheduledId = null;
|
|
this.index = 0;
|
|
this.sorted = false;
|
|
this.frame = 0;
|
|
this.maxFrames = 750;
|
|
}
|
|
VirtualTimeScheduler.prototype.now = function () {
|
|
return this.frame;
|
|
};
|
|
VirtualTimeScheduler.prototype.flush = function () {
|
|
var actions = this.actions;
|
|
var maxFrames = this.maxFrames;
|
|
while (actions.length > 0) {
|
|
var action = actions.shift();
|
|
this.frame = action.delay;
|
|
if (this.frame <= maxFrames) {
|
|
action.execute();
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
actions.length = 0;
|
|
this.frame = 0;
|
|
};
|
|
VirtualTimeScheduler.prototype.addAction = function (action) {
|
|
var actions = this.actions;
|
|
actions.push(action);
|
|
actions.sort(function (a, b) {
|
|
if (a.delay === b.delay) {
|
|
if (a.index === b.index) {
|
|
return 0;
|
|
}
|
|
else if (a.index > b.index) {
|
|
return 1;
|
|
}
|
|
else {
|
|
return -1;
|
|
}
|
|
}
|
|
else if (a.delay > b.delay) {
|
|
return 1;
|
|
}
|
|
else {
|
|
return -1;
|
|
}
|
|
});
|
|
};
|
|
VirtualTimeScheduler.prototype.schedule = function (work, delay, state) {
|
|
if (delay === void 0) { delay = 0; }
|
|
this.sorted = false;
|
|
return new VirtualAction(this, work, this.index++).schedule(state, delay);
|
|
};
|
|
VirtualTimeScheduler.frameTimeFactor = 10;
|
|
return VirtualTimeScheduler;
|
|
}());
|
|
exports.VirtualTimeScheduler = VirtualTimeScheduler;
|
|
var VirtualAction = (function (_super) {
|
|
__extends(VirtualAction, _super);
|
|
function VirtualAction(scheduler, work, index) {
|
|
_super.call(this);
|
|
this.scheduler = scheduler;
|
|
this.work = work;
|
|
this.index = index;
|
|
this.calls = 0;
|
|
}
|
|
VirtualAction.prototype.schedule = function (state, delay) {
|
|
if (delay === void 0) { delay = 0; }
|
|
if (this.isUnsubscribed) {
|
|
return this;
|
|
}
|
|
var scheduler = this.scheduler;
|
|
var action;
|
|
if (this.calls++ === 0) {
|
|
// the action is not being rescheduled.
|
|
action = this;
|
|
}
|
|
else {
|
|
// the action is being rescheduled, and we can't mutate the one in the actions list
|
|
// in the scheduler, so we'll create a new one.
|
|
action = new VirtualAction(scheduler, this.work, scheduler.index += 1);
|
|
this.add(action);
|
|
}
|
|
action.state = state;
|
|
action.delay = scheduler.frame + delay;
|
|
scheduler.addAction(action);
|
|
return this;
|
|
};
|
|
VirtualAction.prototype.execute = function () {
|
|
if (this.isUnsubscribed) {
|
|
throw new Error('How did did we execute a canceled Action?');
|
|
}
|
|
this.work(this.state);
|
|
};
|
|
VirtualAction.prototype.unsubscribe = function () {
|
|
var actions = this.scheduler.actions;
|
|
var index = actions.indexOf(this);
|
|
this.work = void 0;
|
|
this.state = void 0;
|
|
this.scheduler = void 0;
|
|
if (index !== -1) {
|
|
actions.splice(index, 1);
|
|
}
|
|
_super.prototype.unsubscribe.call(this);
|
|
};
|
|
return VirtualAction;
|
|
}(Subscription_1.Subscription));
|
|
//# sourceMappingURL=VirtualTimeScheduler.js.map
|