export type EventBusHandler = (event: Event) => void export class EventBus { private readonly handlers = new Map< keyof Events, Set> >() publish(name: Name, event: Events[Name]): void { const handlers = this.handlers.get(name) if (!handlers) { return } for (const handler of Array.from(handlers)) { handler(event) } } subscribe( name: Name, handler: EventBusHandler, ): () => void { let handlers = this.handlers.get(name) if (!handlers) { handlers = new Set>() this.handlers.set(name, handlers) } const registeredHandler = handler as EventBusHandler handlers.add(registeredHandler) return () => { handlers.delete(registeredHandler) if (handlers.size === 0) { this.handlers.delete(name) } } } }