import type { ReactiveNode } from './alien' export type Selection = Readable export interface InteropSubscribable { subscribe: (observer: Observer) => Subscription } // Based on RxJS types 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 {}