UNPKG

theatre-events

Version:

A full implementation of a standard event dispatcher for javascript

75 lines 2.74 kB
"use strict"; 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