/**
* Простая шина событий с типизированными темами.
* Подписка: on('enemy:killed', handler); шина ничего не знает о жанре.
*/
export class EventBus {
private listeners = new Map<string, Set<(payload: unknown) => void>>();
on<T>(topic: string, handler: (payload: T) => void): () => void {
let set = this.listeners.get(topic);
if (!set) {
set = new Set();
this.listeners.set(topic, set);
}
const wrapped = handler as (payload: unknown) => void;
set.add(wrapped);
return () => set!.delete(wrapped);
}
emit<T>(topic: string, payload?: T): void {
const set = this.listeners.get(topic);
if (!set) return;
for (const handler of [...set]) {
handler(payload);
}
}
clear(): void {
this.listeners.clear();
}
}