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);
    }
};