export type IdentityFn = T extends (...args: infer Args) => infer R ? (...args: Args) => R : never; export interface SubscriberBase { addSubscription(subscription: ISubscription): void; } export interface ISubscriber extends SubscriberBase { _notify(): void; } export interface ISubscription { _getRevision(): IRevision; _addSubscriber(subscriber: ISubscriber): void; _removeSubscriber(subscriber: ISubscriber): void; } export interface IRevision { id: number; } export type MaybeSubscriber = ISubscriber | null; export interface IGettable { get(_subscriber?: ISubscriber): T; _getRevision(): IRevision; } export interface IObservable extends IGettable { set(newValue?: T | UpdaterFn, asIs?: boolean): void; notify(): void; } export interface IObservableImpl extends IObservable, ISubscription {} export interface IComputed extends IGettable { destroy(): void; } export interface IComputedImpl extends IComputed, ISubscriber, ISubscription { _checkAndPassivate(): void; } export type Destructor = (() => void) | null | undefined | void; export type ReactionFn = () => Destructor; export type Disposer = (() => void) & { run: () => void }; export interface IReaction { destroy(): void; run(): void; runManager(): void; subscribe(): void; unsubscribe(): void; unsubscribeAndCleanup(): void; updateRevisions(): void; } export interface IReactionImpl extends IReaction, ISubscriber {} export type CheckFn = (prev: T, next: T) => boolean; export type UpdaterFn = (prevValue: T) => T; export interface IGetter { (subscriber?: ISubscriber): T; revision(): IRevision; } export interface ISetter { (value?: T | UpdaterFn, asIs?: boolean): void; } export interface IObservableGetter extends IGetter { instance: IObservable; } export interface IComputedGetter extends IGetter { instance: IComputed; destroy(): void; } export type IOptions = { reactionScheduler?: (runner: () => void) => void; reactionExceptionHandler?: (exception: Error) => void; };