alm
Version:
The best IDE for TypeScript
113 lines (112 loc) • 3.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var CompositeDisposible = /** @class */ (function () {
function CompositeDisposible() {
var _this = this;
this.disposibles = [];
this.add = function (disposible) {
_this.disposibles.push(disposible);
};
this.dispose = function () {
_this.disposibles.forEach(function (d) { return d.dispose(); });
};
}
return CompositeDisposible;
}());
exports.CompositeDisposible = CompositeDisposible;
/** passes through events as they happen. You will not get events from before you start listening */
var TypedEvent = /** @class */ (function () {
function TypedEvent() {
var _this = this;
this.listeners = [];
this.listenersOncer = [];
this.on = function (listener) {
_this.listeners.push(listener);
return {
dispose: function () { return _this.off(listener); }
};
};
this.once = function (listener) {
_this.listenersOncer.push(listener);
};
this.off = function (listener) {
var callbackIndex = _this.listeners.indexOf(listener);
if (callbackIndex > -1)
_this.listeners.splice(callbackIndex, 1);
};
this.emit = function (event) {
/** Update any `current` listeners */
_this._last = event;
while (_this._currentQueue.length) {
var item = _this._currentQueue.pop();
item.resolve(event);
}
/** Update any general listeners */
_this.listeners.forEach(function (listener) { return listener(event); });
/** Clear the `once` queue */
_this.listenersOncer.forEach(function (listener) { return listener(event); });
_this.listenersOncer = [];
};
this.pipe = function (te) {
return _this.on(function (e) { return te.emit(e); });
};
/**
* A promise that is resolved on first event
* ... or immediately with the last value
*/
this._currentQueue = [];
this._last = null;
this.current = function () {
if (_this._last != null) {
return Promise.resolve(_this._last);
}
else {
var promise_1 = new Promise(function (resolve, reject) {
_this._currentQueue.push({ promise: promise_1, resolve: resolve, reject: reject });
});
return promise_1;
}
};
/**
* Allows you to join in with the last value
* So you don't need to do .current + .on
*/
this.join = function (listener) {
if (_this._last != null) {
listener(_this._last);
}
return _this.on(listener);
};
}
return TypedEvent;
}());
exports.TypedEvent = TypedEvent;
/** single event listener queue */
var SingleListenerQueue = /** @class */ (function () {
function SingleListenerQueue() {
var _this = this;
this.listener = null;
this.pending = [];
this.pendingCount = function () { return _this.pending.length; };
}
SingleListenerQueue.prototype.on = function (listener) {
var _this = this;
this.listener = listener;
// clear pending
this.pending.forEach(function (evt) { return _this.listener(evt); });
this.pending = [];
};
SingleListenerQueue.prototype.off = function () {
this.listener = null;
};
SingleListenerQueue.prototype.emit = function (event) {
if (!this.listener) {
this.pending.push(event);
}
else {
this.listener(event);
}
};
return SingleListenerQueue;
}());
exports.SingleListenerQueue = SingleListenerQueue;