import { Loops } from '.'; class EventDispatcher { private eventsRegister = {}; public addListener( listenerKey: string, event: string|string[], callback: Function, singleAction = false ): this { if (typeof event === 'string') { event = event.split(' '); } Loops.forEach(event, (eventName: string) => { if (!(eventName in this.eventsRegister)) { this.eventsRegister[eventName] = {}; } this.eventsRegister[eventName][listenerKey] = { callback: callback, singleAction: singleAction }; }); return this; } public dispatchEvent(event: string|string[], parameters: any|null = []): this { if (!Array.isArray(parameters)) { parameters = [parameters]; } if (typeof event === 'string') { event = event.split(' '); } Loops.forEach(event, (eventName: string) => { if (!(eventName in this.eventsRegister)) { return; } Loops.forEach(this.eventsRegister[eventName], (eventListener: any, eventListenerKey: string): void => { if (eventListener.singleAction) { this.removeListener(eventListenerKey, eventName); } eventListener.callback.apply(null, parameters); }); }); return this; } public removeListener(listenerKey: string, event: string|string[]): this { if (typeof event === 'string') { event = event.split(' '); } Loops.forEach(event, (eventName: string) => { delete this.eventsRegister[eventName][listenerKey]; }); return this; } } export default new EventDispatcher();