export declare type Listener = (payload: T) => void; export interface BaseSignal { add(listener: Listener, ...tags: any[]): void; remove(listenerOrTag: any): void; } export interface ReadableSignal extends BaseSignal { addOnce(listener: Listener, ...tags: any[]): void; filter(filter: (payload: T) => payload is U): ReadableSignal; filter(filter: (payload: T) => boolean): ReadableSignal; map(transform: (payload: T) => U): ReadableSignal; merge(...signals: ReadableSignal[]): ReadableSignal; promisify(rejectSignal?: ReadableSignal): Promise; peek(peekaboo: (payload: T) => void): ReadableSignal; readOnly(): ReadableSignal; cache(cache: Cache): ReadableSignal; reduce(accumulator: Accumulator, initialValue: U): ReadableSignal; } export interface WritableSignal { dispatch: (payload: T) => void; /** * set a listener to be called if no other listeners are available. */ setDefaultListener(listener: Listener): void; } export interface Cache { add(payload: T): void; forEach(callback: (payload: T) => void): void; } export declare type Accumulator = (accum: U, current: T) => any; export declare type PayloadOf> = S extends BaseSignal ? T : never; export declare type ReadOnlyVersionOf> = S extends BaseSignal ? ReadableSignal : never;