theatre-events
Version:
A full implementation of a standard event dispatcher for javascript
77 lines • 2.33 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const event_listener_1 = require("./../event-listener");
/**
* Dispatch events synchronously through your application.
*/
class SynchronousEventDispatcher {
constructor() {
this.eventListeners = new Map();
}
/**
* {@inheritdoc}
*/
dispatch(name, payload) {
if (!this.eventListeners.has(name)) {
return payload;
}
let priorities = [];
this.eventListeners.get(name).forEach((l, priority) => {
priorities.push(priority);
});
priorities.sort().map((priority) => {
this.eventListeners.get(name).get(priority).map(l => l(payload));
});
return 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.has(name)) {
return;
}
this.eventListeners.get(name).forEach((listeners, index) => {
listeners.map((registeredListener, i) => {
if (registeredListener !== listener) {
return;
}
listeners.splice(i, 1);
});
if (!listeners.length) {
this.eventListeners.get(name).delete(index);
}
});
if (!this.eventListeners.get(name).size) {
this.eventListeners.delete(name);
}
}
/**
* {@inheritdoc}
*/
clearEventListeners(name) {
if (!name) {
this.eventListeners.clear();
return;
}
if (!this.eventListeners.has(name)) {
return;
}
this.eventListeners.get(name).clear();
}
}
exports.default = SynchronousEventDispatcher;
//# sourceMappingURL=synchronous-event-dispatcher.js.map