Files
orcs-code/src/utils/signal.ts
did:key:z6MkqDnb7Siv3Cwj7pGJq4T5EsUisECqR8KpnDLwcaZq5TPr d2542c9a62 asdf
Squash the current repository state back into one baseline commit while
preserving the README reframing and repository contents.

Constraint: User explicitly requested a single squashed commit with subject "asdf"
Confidence: high
Scope-risk: broad
Reversibility: clean
Directive: This commit intentionally rewrites published history; coordinate before future force-pushes
Tested: git status clean; local history rewritten to one commit; force-pushed main to origin and instructkr
Not-tested: Fresh clone verification after push
2026-03-31 03:34:03 -07:00

44 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Tiny listener-set primitive for pure event signals (no stored state).
*
* Collapses the ~8-line `const listeners = new Set(); function subscribe(){…};
* function notify(){for(const l of listeners) l()}` boilerplate that was
* duplicated ~15× across the codebase into a one-liner.
*
* Distinct from a store (AppState, createStore) — there is no snapshot, no
* getState. Use this when subscribers only need to know "something happened",
* optionally with event args, not "what is the current value".
*
* Usage:
* const changed = createSignal<[SettingSource]>()
* export const subscribe = changed.subscribe
* // later: changed.emit('userSettings')
*/
export type Signal<Args extends unknown[] = []> = {
/** Subscribe a listener. Returns an unsubscribe function. */
subscribe: (listener: (...args: Args) => void) => () => void
/** Call all subscribed listeners with the given arguments. */
emit: (...args: Args) => void
/** Remove all listeners. Useful in dispose/reset paths. */
clear: () => void
}
export function createSignal<Args extends unknown[] = []>(): Signal<Args> {
const listeners = new Set<(...args: Args) => void>()
return {
subscribe(listener) {
listeners.add(listener)
return () => {
listeners.delete(listener)
}
},
emit(...args) {
for (const listener of listeners) listener(...args)
},
clear() {
listeners.clear()
},
}
}