UNPKG

ecsy

Version:
83 lines (74 loc) 2.08 kB
/** * @private * @class EventDispatcher */ export default class EventDispatcher { constructor() { this._listeners = {}; this.stats = { fired: 0, handled: 0, }; } /** * Add an event listener * @param {String} eventName Name of the event to listen * @param {Function} listener Callback to trigger when the event is fired */ addEventListener(eventName, listener) { let listeners = this._listeners; if (listeners[eventName] === undefined) { listeners[eventName] = []; } if (listeners[eventName].indexOf(listener) === -1) { listeners[eventName].push(listener); } } /** * Check if an event listener is already added to the list of listeners * @param {String} eventName Name of the event to check * @param {Function} listener Callback for the specified event */ hasEventListener(eventName, listener) { return ( this._listeners[eventName] !== undefined && this._listeners[eventName].indexOf(listener) !== -1 ); } /** * Remove an event listener * @param {String} eventName Name of the event to remove * @param {Function} listener Callback for the specified event */ removeEventListener(eventName, listener) { var listenerArray = this._listeners[eventName]; if (listenerArray !== undefined) { var index = listenerArray.indexOf(listener); if (index !== -1) { listenerArray.splice(index, 1); } } } /** * Dispatch an event * @param {String} eventName Name of the event to dispatch * @param {Entity} entity (Optional) Entity to emit * @param {Component} component */ dispatchEvent(eventName, entity, component) { this.stats.fired++; var listenerArray = this._listeners[eventName]; if (listenerArray !== undefined) { var array = listenerArray.slice(0); for (var i = 0; i < array.length; i++) { array[i].call(this, entity, component); } } } /** * Reset stats counters */ resetCounters() { this.stats.fired = this.stats.handled = 0; } }