export default class EventEmitter { private $listeners: Record = {}; /** * once event listener * @param event * @param listener */ public once(event: string, listener: Function) { let fn = (...args: any[]) => { listener.apply(null, args); this.removeListener(event, fn); }; this.addListener(event, fn); return this; } /** * add event listener * @param event * @param listener */ public addListener(event: string, listener: Function) { this.$listeners[event] = this.$listeners[event] || []; if (this.$listeners[event].indexOf(listener) === -1) { this.$listeners[event].push(listener); } return this; } /** * emit event * @param event * @param args */ public emit(event: string, ...args: any[]) { (this.$listeners[event] || []).forEach((fn) => { fn.apply(null, args); }); } /** * remove one event listener * @param event * @param listener */ public removeListener(event: string, listener: Function) { this.$listeners[event] = (this.$listeners[event] || []).filter((fn) => fn !== listener); } /** * remove all event * @param event */ public removeAllListener(event?: string) { if (event) { this.$listeners[event] = []; } else { this.$listeners = {}; } } }