theatre-events
Version:
A full implementation of a standard event dispatcher for javascript
75 lines • 2.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var event_listener_1 = require("./../event-listener");
/**
* An asynchronous implementation of an event dispatcher.
*/
var AsynchronousEventDispatcher = (function () {
function AsynchronousEventDispatcher() {
this.eventListeners = new Map();
}
/**
* {@inheritdoc}
*/
AsynchronousEventDispatcher.prototype.dispatch = function (name, payload) {
var _this = this;
var promises = [];
if (!this.eventListeners.has(name)) {
return Promise.all(promises).then(function () { return payload; });
}
var priorities = [];
this.eventListeners.get(name).forEach(function (v, k) { priorities.push(k); });
priorities.sort().map(function (priority) { return _this.eventListeners.get(name).get(priority).map(function (l) {
promises.push(l(payload));
}); });
return Promise.all(promises).then(function () { return payload; });
};
/**
* {@inheritdoc}
*/
AsynchronousEventDispatcher.prototype.addEventListener = function (name, listener) {
listener.priority = listener.priority || event_listener_1.NORMAL_PRIORITY;
if (!this.eventListeners.has(name)) {
this.eventListeners.set(name, new Map());
}
if (!this.eventListeners.get(name).has(listener.priority)) {
this.eventListeners.get(name).set(listener.priority, []);
}
this.eventListeners.get(name).get(listener.priority).push(listener);
};
/**
* {@inheritdoc}
*/
AsynchronousEventDispatcher.prototype.removeEventListener = function (name, listener) {
var _this = this;
if (!this.eventListeners.get(name)) {
return;
}
this.eventListeners.get(name).forEach(function (stack, priority) {
stack.map(function (callback, index) {
if (callback !== listener) {
return;
}
stack.splice(index, 1);
});
if (!stack.length) {
_this.eventListeners.get(name).delete(priority);
}
});
if (!this.eventListeners.get(name).size) {
this.eventListeners.delete(name);
}
};
/**
* {inheritdoc}
*/
AsynchronousEventDispatcher.prototype.clearEventListeners = function (name) {
if (!name) {
this.eventListeners.clear();
}
this.eventListeners.has(name) && this.eventListeners.delete(name);
};
return AsynchronousEventDispatcher;
}());
exports.default = AsynchronousEventDispatcher;
//# sourceMappingURL=asynchronous-event-dispatcher.js.map