@malagu/core
Version:
90 lines • 3.06 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", { value: true });
exports.CallbackList = exports.Event = void 0;
var Event;
(function (Event) {
const _disposable = { dispose() { } };
Event.None = Object.assign(function () { return _disposable; }, {
get maxListeners() { return 0; },
set maxListeners(maxListeners) { }
});
/**
* Given an event and a `map` function, returns another event which maps each element
* through the mapping function.
*/
function map(event, mapFunc) {
return Object.assign((listener, thisArgs, disposables) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
maxListeners: 0,
});
}
Event.map = map;
})(Event = exports.Event || (exports.Event = {}));
class CallbackList {
get length() {
return this._callbacks && this._callbacks.length || 0;
}
add(callback, context = undefined, bucket) {
if (!this._callbacks) {
this._callbacks = [];
this._contexts = [];
}
this._callbacks.push(callback);
this._contexts.push(context);
if (Array.isArray(bucket)) {
bucket.push({ dispose: () => this.remove(callback, context) });
}
}
remove(callback, context = undefined) {
if (!this._callbacks) {
return;
}
let foundCallbackWithDifferentContext = false;
for (let i = 0; i < this._callbacks.length; i++) {
if (this._callbacks[i] === callback) {
if (this._contexts[i] === context) {
// callback & context match => remove it
this._callbacks.splice(i, 1);
this._contexts.splice(i, 1);
return;
}
else {
foundCallbackWithDifferentContext = true;
}
}
}
if (foundCallbackWithDifferentContext) {
throw new Error('When adding a listener with a context, you should remove it with the same context');
}
}
// tslint:disable-next-line:typedef
[Symbol.iterator]() {
if (!this._callbacks) {
return [][Symbol.iterator]();
}
const callbacks = this._callbacks.slice(0);
const contexts = this._contexts.slice(0);
return callbacks.map((callback, i) => (...args) => callback.apply(contexts[i], args))[Symbol.iterator]();
}
invoke(...args) {
const ret = [];
for (const callback of this) {
try {
ret.push(callback(...args));
}
catch (e) {
console.error(e);
}
}
return ret;
}
isEmpty() {
return !this._callbacks || this._callbacks.length === 0;
}
dispose() {
this._callbacks = undefined;
this._contexts = undefined;
}
}
exports.CallbackList = CallbackList;
//# sourceMappingURL=event.js.map