import { ReactiveNode } from './alien.js'; export type Selection = Readable; export interface InteropSubscribable { subscribe: (observer: Observer) => Subscription; } export type Observer = { next?: (value: T) => void; error?: (err: unknown) => void; complete?: () => void; }; export interface Subscription { unsubscribe: () => void; } export interface Subscribable extends InteropSubscribable { subscribe: ((observer: Observer) => Subscription) & ((next: (value: T) => void, error?: (error: any) => void, complete?: () => void) => Subscription); } export interface Readable extends Subscribable { get: () => T; } export interface BaseAtom extends Subscribable, Readable { } export interface InternalBaseAtom extends Subscribable, Readable { /** @internal */ _snapshot: T; /** @internal */ _update: (getValue?: T | ((snapshot: T) => T)) => boolean; } export interface Atom extends BaseAtom { /** Sets the value of the atom using a function. */ set: ((fn: (prevVal: T) => T) => void) & ((value: T) => void); } export interface AtomOptions { compare?: (prev: T, next: T) => boolean; } export type AnyAtom = BaseAtom; export interface InternalReadonlyAtom extends InternalBaseAtom, ReactiveNode { } /** * An atom that is read-only and cannot be set. * * @example * * ```ts * const atom = createAtom(() => 42); * // @ts-expect-error - Cannot set a readonly atom * atom.set(43); * ``` */ export interface ReadonlyAtom extends BaseAtom { }