UNPKG

@white-matrix/event-emitter

Version:

The Emitter can be used to expose an Event to the public to fire it from the insides.

158 lines (153 loc) 5.65 kB
"use strict"; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Emitter = void 0; var linkedList_1 = require("./linkedList"); /** * The Emitter can be used to expose an Event to the public * to fire it from the insides. * Sample: class Document { private readonly _onDidChange = new Emitter<(value:string)=>any>(); public onDidChange = this._onDidChange.event; // getter-style // get onDidChange(): Event<(value:string)=>any> { // return this._onDidChange.event; // } private _doIt() { //... this._onDidChange.fire(value); } } */ var Emitter = /** @class */ (function () { function Emitter(options) { this._options = options; } Object.defineProperty(Emitter.prototype, "event", { /** * For the public to allow to subscribe * to events from this Emitter */ get: function () { var _this = this; if (!this._event) { this._event = function (listener, thisArgs) { if (!_this._listeners) { _this._listeners = new linkedList_1.LinkedList(); } var firstListener = _this._listeners.isEmpty(); if (firstListener && _this._options && _this._options.onFirstListenerAdd) { _this._options.onFirstListenerAdd(_this); } var remove = _this._listeners.push(!thisArgs ? listener : [listener, thisArgs]); if (firstListener && _this._options && _this._options.onFirstListenerDidAdd) { _this._options.onFirstListenerDidAdd(_this); } if (_this._options && _this._options.onListenerDidAdd) { _this._options.onListenerDidAdd(_this, listener, thisArgs); } var result = { dispose: function () { remove(); if (_this._options && _this._options.onLastListenerRemove) { var hasListeners = _this._listeners && !_this._listeners.isEmpty(); if (!hasListeners) { _this._options.onLastListenerRemove(_this); } } } }; return result; }; } return this._event; }, enumerable: false, configurable: true }); /** * To be kept private to fire an event to * subscribers */ Emitter.prototype.fire = function (event) { var e_1, _a; if (this._listeners) { // put all [listener,event]-pairs into delivery queue // then emit all event. an inner/nested event might be // the driver of this if (!this._deliveryQueue) { this._deliveryQueue = new linkedList_1.LinkedList(); } try { for (var _b = __values(this._listeners), _c = _b.next(); !_c.done; _c = _b.next()) { var listener = _c.value; this._deliveryQueue.push([listener, event]); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } while (this._deliveryQueue.size > 0) { var _d = __read(this._deliveryQueue.shift(), 2), listener = _d[0], event_1 = _d[1]; try { if (typeof listener === 'function') { // eslint-disable-next-line no-useless-call listener.call(undefined, event_1); } else { listener[0].call(listener[1], event_1); } } catch (e) { console.error(e); } } } }; Emitter.prototype.dispose = function () { if (this._listeners) { this._listeners.clear(); } if (this._deliveryQueue) { this._deliveryQueue.clear(); } }; Emitter._noop = function () { }; return Emitter; }()); exports.Emitter = Emitter;