ab-event-emitter
Version:
My implementation of event emitter
132 lines (131 loc) • 4.56 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ABEventEmitter = void 0;
var MutableList = /** @class */ (function () {
function MutableList() {
this.list = null;
this.len = 0;
}
MutableList.prototype.prepend = function (value) {
this.list = { value: value, next: this.list };
this.len += 1;
};
MutableList.prototype.remove = function (item) {
if (!this.list)
return;
if (this.list.value === item) {
this.list = this.list.next;
this.len -= 1;
return;
}
var current = this.list;
while (current.next && current.next.value !== item)
current = current.next;
if (!current.next)
return;
current.next = current.next.next;
this.len -= 1;
};
MutableList.prototype.length = function () {
return this.len;
};
MutableList.prototype.iterate = function (callback) {
var current = this.list;
while (current) {
callback(current.value);
current = current.next;
}
};
MutableList.prototype.toArray = function () {
var res = [];
this.iterate(function (d) {
res.push(d);
});
return res;
};
return MutableList;
}());
var EVENT_EXCLUDED = "ee-event-excluded";
var EVENT_INCLUDED = "ee-event-included";
var ABEventEmitter = /** @class */ (function () {
function ABEventEmitter() {
this.listenersDict = {};
this.listenedEvents = new MutableList();
}
ABEventEmitter.prototype.on = function (event, listener) {
var _this = this;
if (this.listenersDict[event]) {
var listeners = this.listenersDict[event];
listeners.prepend(listener);
if (listeners.length() === 1) {
this.listenedEvents.prepend(event);
}
return function () {
_this.off(event, listener);
};
}
var listenersList = new MutableList();
listenersList.prepend(listener);
this.listenersDict[event] = listenersList;
this.listenedEvents.prepend(event);
this.emit(ABEventEmitter.EventIncluded, event);
return function () {
_this.off(event, listener);
};
};
ABEventEmitter.prototype.off = function (event, listener) {
if (!listener) {
return this.offEvent(event);
}
var listeners = this.listenersDict[event];
if (listeners) {
listeners.remove(listener);
if (listeners.length() === 0) {
this.listenedEvents.remove(event);
delete this.listenersDict[event];
this.emit(ABEventEmitter.EventExcluded, event);
}
return this;
}
return this;
};
ABEventEmitter.prototype.emit = function (event, data) {
var listeners = this.listenersDict[event];
if (listeners) {
listeners.iterate(function (callback) { return callback(data); });
}
return this;
};
ABEventEmitter.prototype.offAll = function () {
var _this = this;
this.listenersDict = {};
this.listenedEvents.iterate(function (event) {
_this.emit(ABEventEmitter.EventExcluded, event);
});
this.listenedEvents = new MutableList();
return this;
};
ABEventEmitter.prototype.offEvent = function (event) {
if (!this.listenersDict[event])
return this;
this.listenedEvents.remove(event);
delete this.listenersDict[event];
this.emit(ABEventEmitter.EventExcluded, event);
return this;
};
ABEventEmitter.prototype.listenersNumber = function (event) {
var listenersList = this.listenersDict[event];
return listenersList ? listenersList.length() : 0;
};
ABEventEmitter.prototype.getListenedEvents = function () {
return this.listenedEvents.toArray();
};
ABEventEmitter.prototype.getListeners = function (event) {
var listeners = this.listenersDict[event];
return listeners ? listeners.toArray() : [];
};
ABEventEmitter.EventExcluded = EVENT_EXCLUDED;
ABEventEmitter.EventIncluded = EVENT_INCLUDED;
return ABEventEmitter;
}());
exports.ABEventEmitter = ABEventEmitter;