export interface EventListener { (event: T): any; } /** * Dispose event handler */ export type EventDisposable = () => void; /** * Tiny Events class * * - One `Events` has one type * - Each event handler has one object */ export class Events { private listeners: EventListener[] = []; private listenersOnce: EventListener[] = []; addEventListener(listener: EventListener): EventDisposable { this.listeners.push(listener); return () => this.removeEventListener(listener); } addEventListenerOnce(listener: EventListener): void { this.listenersOnce.push(listener); } removeEventListener(listener: EventListener): void { const callbackIndex = this.listeners.indexOf(listener); if (callbackIndex !== -1) { this.listeners.splice(callbackIndex, 1); } } removeAllEventListeners(): void { this.listeners = []; this.listenersOnce = []; } emit(payload: T): void { /** Update any general listeners */ this.listeners.forEach((listener) => listener(payload)); /** Clear the `once` queue */ if (this.listenersOnce.length > 0) { this.listenersOnce.forEach((listener) => listener(payload)); this.listenersOnce = []; } } }