import type { AppEvent, EventListener, EventName, EventOf } from "#types/event.types"; import type { Disposer } from "#types/base.types"; const listeners = new Map>(); const isNamed = function isNamed(event: AppEvent, name: N): event is EventOf { return event.name === name; }; export const subscribeEvent = function subscribeEvent( name: N, listener: EventListener>, ): Disposer { const existing = listeners.get(name) ?? new Set(); const guarded: EventListener = (event) => { if (isNamed(event, name)) { listener(event); } }; existing.add(guarded); listeners.set(name, existing); return () => { existing.delete(guarded); }; }; export const emitEvent = function emitEvent(event: AppEvent): void { for (const listener of listeners.get(event.name) ?? []) { listener(event); } };