UNPKG

@malagu/core

Version:
90 lines 3.06 kB
"use strict"; /* 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