import { Tracer, TracerMeta } from './trace.js'; import { ReactiveValue, Equals, ReactiveOptions } from '../types.js'; import { SignalScope } from './contexts.js'; import { Edge } from './edge.js'; import { Callback } from './callback.js'; /** * This file contains computed signal base types and struct definitions. * * Computed signals are monomorphic to make them more efficient, but this also * means that multiple fields differ based on the type of the signal. Defining * them using this pattern rather than a class allows us to switch on the `type` * field to get strong typing in branches everywhere else. * * "Methods" for this struct are defined in other files for better organization. */ export type SignalId = number; export declare const enum ReactiveFnState { Clean = 0, Pending = 1, Dirty = 2, MaybeDirty = 3, PendingDirty = 4 } export declare const enum ReactiveFnFlags { State = 7, isRelay = 8, isListener = 16, isActive = 32, isLazy = 64 } interface ListenerMeta { updatedAt: number; current: Map<() => void, () => void>; cachedBoundAdd: (listener: () => void) => () => void; } /** * Shared definition for derived signals to reduce memory usage. * Contains configuration that's common across all instances of a reactive function. */ export interface ReactiveDefinition extends ReactiveOptions { compute: (...args: Args) => T; equals: Equals; isRelay: boolean; tracer: Tracer | undefined; } /** * Unified way to create a reactive definition (protects shaping) */ export declare function createReactiveDefinition(id: string | undefined, desc: string | undefined, compute: (...args: Args) => T, equals: Equals | false | undefined, isRelay: boolean, paramKey: ((...args: Args) => string | number) | undefined, tracer: Tracer | undefined): ReactiveDefinition; export declare class ReactiveSignal { private flags; scope: SignalScope | undefined; id: number; subs: Map>, Edge>; deps: Map, Edge>; ref: WeakRef>; dirtyHead: Edge | undefined; updatedCount: number; computedCount: number; watchCount: number; key: SignalId | undefined; args: Args; callbacks: Callback[] | undefined; _listeners: ListenerMeta | null; _value: ReactiveValue | undefined; tracerMeta?: TracerMeta; desc: string | undefined; def: ReactiveDefinition; constructor(def: ReactiveDefinition, args: Args, key?: SignalId, scope?: SignalScope); get _state(): ReactiveFnState; set _state(state: ReactiveFnState); get _isListener(): boolean; get _isActive(): boolean; set _isActive(isActive: boolean); get _isLazy(): boolean; set _isLazy(isLazy: boolean); get listeners(): { updatedAt: number; current: Map; cachedBoundAdd: (listener: () => void, opts?: { skipInitial?: boolean; }) => () => void; }; get value(): ReactiveValue; addListener(listener: () => void, opts?: { skipInitial?: boolean; }): () => void; addListenerLazy(watch?: boolean): (listener: () => void, opts?: { skipInitial?: boolean; }) => () => void; } export declare const runListeners: (signal: ReactiveSignal) => void; export declare const isRelay: (signal: ReactiveSignal) => boolean; export declare function createReactiveSignal(def: ReactiveDefinition, args?: Args, key?: SignalId, scope?: SignalScope): ReactiveSignal; export {}; //# sourceMappingURL=reactive.d.ts.map