export type EmitusListener = (eventName: string, arg: T) => void export interface Emitus { /** * Adds an event listener * * @param eventName string * @param listener EmitusListener */ on (eventName: string, listener: EmitusListener): void /** * Removes a registered event listener * * @param eventName string * @param listener EmitusListener */ off (eventName: string, listener: EmitusListener): void /** * Emits a registered event listener * * @param eventName string * @param listener EmitusListener */ emit (eventName: string, arg?: T): void } export function emitus (): Emitus { const events: [string, Function][] = [] return { on (eventName: string, listener: EmitusListener) { if (eventName && listener) events.push([ eventName, listener ]) }, off (eventName: string, listener: EmitusListener) { for (let i = 0; i < events.length; i++) { if (eventName === events[i][0] && listener === events[i][1]) events.splice(i, 1) } }, emit (eventName: string, arg?: T) { for (let i = 0; i < events.length; i++) { if (eventName && eventName === events[i][0]) events[i][1](eventName, arg || null) } } } }