import { Readonly } from './access'; export type InferNullable = IsNullable extends true ? T | undefined : T; export interface ObservableStackItem { id: string; name: string; emitCount: number; isError: boolean; errorMessage?: string; error?: Error; } export declare enum StreamHaltReason { Manual = "manual", Unchanged = "unchanged", GuardRejected = "guard_rejected", ErrorHandled = "error_handled", Cancelled = "cancelled" } export type StreamHaltEvent = { reason: StreamHaltReason.Manual; isTerminal: false; } | { reason: StreamHaltReason.Unchanged; isTerminal: false; } | { reason: StreamHaltReason.GuardRejected; isTerminal: false; } | { reason: StreamHaltReason.ErrorHandled; isTerminal: false; } | { reason: StreamHaltReason.Cancelled; isTerminal: true; }; export type FinallyEventType = 'onValue' | 'onError' | 'onHalt' | 'onCancel'; export interface StreamSubscription { unsubscribe: () => void; cancelStream?: () => void; } /** @internal */ export type ObservableGetter = () => Readonly; /** @internal */ export type ObservableSetter = (newValue: NullableInferredT | Readonly | ((currentValue: Readonly) => NullableInferredT | Readonly), stack?: ObservableStackItem[]) => boolean; /** @internal */ export type SubscribeFunction = (onEmit?: (value: Readonly, stack?: ObservableStackItem[]) => void, onError?: (error: Error, stack?: ObservableStackItem[]) => void, onStreamHalted?: (stack?: ObservableStackItem[], event?: StreamHaltEvent) => void) => () => void; /** @internal */ export interface StreamOption { initialValue?: NullableInferredT; streamedName?: string; executeOnCreation?: boolean; } export type StreamProjection = (project: (data: NullableInferredT) => IsAsync extends true ? Promise> : InferNullable, options?: StreamOption>) => Observable>; /** @internal */ export type TapOperator = (callback: (currentValue: Readonly) => void) => Observable; /** @internal */ export type DelayOperator = (milliseconds: number) => Observable; export type ThrottleOperator = (milliseconds: number) => Observable; /** @internal */ export type CatchErrorOperator = (onError?: (error: Error, previousValue: Readonly) => ErrorResolution | void) => Observable; /** @internal */ export type ResetOperator = () => void; /** @internal */ export type EmitOperator = (stack?: ObservableStackItem[]) => void; /** @internal */ export type EmitErrorOperator = (error: Error, stack?: ObservableStackItem[]) => void; /** @internal */ export type EmitStreamHaltedOperator = (stack?: ObservableStackItem[], event?: StreamHaltEvent) => void; /** @internal */ export type CancelStreamOperator = (stack?: ObservableStackItem[]) => void; /** @internal */ export type UnsubscribeFunction = (id: string) => void; /** @internal */ export type MapEntriesReturn = { [K in keyof NullableInferredT as `${string & K}${P}`]: Observable; }; /** @internal */ export type MapEntriesOperator =

({ keys, observablePostfix, }: { keys?: (keyof NullableInferredT)[]; observablePostfix?: P; }) => MapEntriesReturn; /** @internal */ export type GetInitialValueOperator = () => NullableInferredT; export type ErrorResolution = { restoreValue: NullableInferredT; }; export interface Observable { get: ObservableGetter; set: ObservableSetter; setSilent: ObservableSetter; getEmitCount: () => number; subscribe: SubscribeFunction; subscribeOnce: SubscribeFunction; subscribeWithValue: SubscribeFunction; stream: StreamProjection; streamAsync: StreamProjection; combineLatestFrom: (...observables: { [K in keyof U]: Observable; }) => Observable<[NullableInferredT, ...{ [K in keyof U]: U[K]; }]>; withLatestFrom: (...observables: [...{ [K in keyof OtherT]: Observable; }]) => Observable<[NullableInferredT, ...{ [K in keyof OtherT]: OtherT[K]; }]>; tap: TapOperator; delay: DelayOperator; throttle: ThrottleOperator; catchError: CatchErrorOperator; reset: ResetOperator; getName: () => string; setName: (name: string) => void; getId: () => string; emit: EmitOperator; emitError: EmitErrorOperator; emitStreamHalted: EmitStreamHaltedOperator; cancelStream: CancelStreamOperator; mapEntries: MapEntriesOperator; getInitialValue: GetInitialValueOperator; guard: (predicate: (nextValue: Readonly, previousValue: Readonly) => boolean) => Observable; finally: (callback: (type: FinallyEventType, value?: Readonly, error?: Error, stack?: ObservableStackItem[], event?: StreamHaltEvent) => void) => Observable; getIsFlushable: () => boolean; getIsStreamCancelled: () => boolean; } export type Duckservable = Record, any>; export interface CreateObservableParams { initialValue: NullableInferredT | (() => NullableInferredT); equalityFn?: (a: Readonly, b: Readonly) => boolean; emitWhenValuesAreEqual?: boolean; name?: string; isFlushable?: boolean; } /** @internal */ export interface ListenerRecord { listener?: (value: Readonly, stack?: ObservableStackItem[]) => void; onError?: (error: Error, stack?: ObservableStackItem[]) => void; onStreamHalted?: (stack?: ObservableStackItem[], event?: StreamHaltEvent) => void; id: string; once?: boolean; } export interface PersistentObservable extends Observable { rehydrate: () => Promise; }