export type Listener = (x: X) => void export type Pub = { (listener: Listener): () => void once(listener: Listener): () => void publish(x: X): void clear(): void } /** @deprecated use `pubsub` instead */ export function pub(): Pub { const listeners = new Set>() function subscribe(listener: Listener) { listeners.add(listener) return () => void listeners.delete(listener) } subscribe.publish = (x: X) => { for (const listener of listeners) listener(x) } subscribe.clear = () => listeners.clear() subscribe.once = (listener: Listener) => { const actual_listener = (x: X) => { listener(x) listeners.delete(actual_listener) } listeners.add(actual_listener) return () => void listeners.delete(actual_listener) } return subscribe }