core/buses/base.bus.ts
core/buses/base.bus.ts is a file in Bane's Lab Site. 27 lines of code and 6 definitions.
import type { AppEvent, EventListener, EventName, EventOf } from "#types/event.types";
import type { Disposer } from "#types/base.types";
const listeners = new Map<EventName, Set<EventListener>>();
const isNamed = function isNamed<N extends EventName>(event: AppEvent, name: N): event is EventOf<N> {
return event.name === name;
};
export const subscribeEvent = function subscribeEvent<N extends EventName>(
name: N,
listener: EventListener<EventOf<N>>,
): Disposer {
const existing = listeners.get(name) ?? new Set<EventListener>();
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);
}
};