theatre-events
Version:
A full implementation of a standard event dispatcher for javascript
72 lines • 2.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const event_listener_1 = require("./../event-listener");
/**
* An asynchronous implementation of an event dispatcher.
*/
class AsynchronousEventDispatcher {
constructor() {
this.eventListeners = new Map();
}
/**
* {@inheritdoc}
*/
dispatch(name, payload) {
let promises = [];
if (!this.eventListeners.has(name)) {
return Promise.all(promises).then(() => payload);
}
let priorities = [];
this.eventListeners.get(name).forEach((v, k) => { priorities.push(k); });
priorities.sort().map(priority => this.eventListeners.get(name).get(priority).map(l => {
promises.push(l(payload));
}));
return Promise.all(promises).then(() => payload);
}
/**
* {@inheritdoc}
*/
addEventListener(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}
*/
removeEventListener(name, listener) {
if (!this.eventListeners.get(name)) {
return;
}
this.eventListeners.get(name).forEach((stack, priority) => {
stack.map((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}
*/
clearEventListeners(name) {
if (!name) {
this.eventListeners.clear();
}
this.eventListeners.has(name) && this.eventListeners.delete(name);
}
}
exports.default = AsynchronousEventDispatcher;
//# sourceMappingURL=asynchronous-event-dispatcher.js.map