import type { SCOPE } from './symbols'; export interface Computation extends Scope { id?: string | undefined; /** @internal */ _effect: boolean; /** @internal */ _init: boolean; /** @internal */ _value: T; /** @internal */ _sources: Computation[] | null; /** @internal */ _observers: Computation[] | null; /** @internal */ _compute: (() => T) | null; /** @internal */ _changed: (prev: T, next: T) => boolean; /** read */ call(this: Computation): T; } export interface ReadSignal { (): T; /** only available during dev. */ node?: Computation; } export interface SignalOptions { id?: string; dirty?: (prev: T, next: T) => boolean; } export interface ComputedSignalOptions extends SignalOptions { initial?: R; } export type InferSignalValue = T extends ReadSignal ? R : T; export interface WriteSignal extends ReadSignal { /** only available during dev. */ node?: Computation; set: (value: T | NextValue) => T; } export interface NextValue { (prevValue: T): T; } export interface Scope { [SCOPE]: Scope | null; /** @internal */ _state: number; /** @internal */ _compute: unknown; /** @internal */ _children: Scope | Scope[] | null; /** @internal */ _context: ContextRecord | null; /** @internal */ _handlers: ErrorHandler[] | null; /** @internal */ _disposal: Disposable | Disposable[] | null; append(scope: Scope): void; dispose(): void; } export interface Dispose { (): void; } export interface Disposable extends Callable { } export interface Effect { (): MaybeStopEffect; } export interface StopEffect { (): void; } export interface Callable { call($this: This): Return; } export type Maybe = T | void | null | undefined | false; export type MaybeFunction = Maybe<(...args: any) => any>; export type MaybeDisposable = Maybe; export type MaybeStopEffect = Maybe; export type MaybeSignal = MaybeFunction | ReadSignal; export type ContextRecord = Record; export interface ErrorHandler { (error: T): void; }