@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
JavaScript
;
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;