import { Event } from '../common'; /**@internal * */ export type Handler = (event: E) => any; /**@internal * */ export class MultiCastEventSource { private handlers: {} = {}; protected _on(event: string, handler: Handler): Handler { this.handlers[event] = this.handlers[event] || []; this.handlers[event].push(handler); return handler; } protected _off(event?: string, handler?: Handler): this { if (event) { const hh = this.handlers[event] as Handler[]; if (hh) { if (handler) this.handlers[event] = hh.filter(h => h !== handler); else delete this.handlers[event]; } } else this.handlers = {}; return this; } protected emit(event: Event): void { if (!event) return; const eventName: string = event.type; const unicast: Handler = this["on" + eventName]; if (unicast) this.invoke(unicast, event); const multicast: Handler[] = this.handlers[eventName]; if (multicast) multicast.forEach(h => this.invoke(h, event)); } private invoke(handler: Handler, event: Event) { try { handler(event); } catch (e) { console.error(e); } } }