export type Setter = ((prev: T) => T) | T; export type Watch = (fn: () => void, immediate?: boolean) => () => void; export type Signal = { readonly get: () => T; readonly set: (v: Setter) => void; readonly peek: () => T; readonly use: () => T; readonly watch: Watch; }; export type ReadonlySignal = { readonly get: () => T; readonly peek: () => T; readonly watch: Watch; readonly use: () => T; }; export interface SignalOptions { readonly equal?: (l: T, r: T) => boolean; readonly bind?: (v: T) => T; readonly postUpdate?: () => void; }