export type EmitterListener = (event: T, value: unknown) => void; export class EventEmitter { private readonly listeners: Map>>; constructor() { this.listeners = new Map>>(); } emit(event: T, value?: unknown): void { const listeners = this.listeners.get(event); if (listeners) { listeners.forEach(listener => listener(event, value)); } } on(event: T, listener: EmitterListener) { const listeners = this.listeners.get(event); if (!listeners) { this.listeners.set(event, new Set>([listener])); } else { listeners.add(listener); } } off(event: T, listener: EmitterListener) { const listeners = this.listeners.get(event); if (listeners && listeners.has(listener)) { listeners.delete(listener); } } clear() { this.listeners.clear(); } }