export interface StateTree { [key: string]: StateTree | any; } export type Read = { readonly [P in keyof xTree]: xTree[P] extends StateTree ? Read : xTree[P]; }; export type Observer = (readable: xTree) => X; export type Reaction = (x: X) => void; export interface TrackingSession { paths: string[][]; flip: boolean; observer: Observer; reaction?: Reaction; } export type Subscription = (readable: xTree) => void; export interface RestrictedSnapstate { state: xTree; readable: xTree; readonly: Read; subscribe(subscription: Subscription): () => void; track(observer: Observer, reaction?: Reaction, options?: { flip?: boolean; }): () => void; unsubscribeAll(): void; untrackAll(): void; wait(): Promise; } export interface Snapstate extends RestrictedSnapstate { writable: xTree; } export type GetTree> = xSnap extends RestrictedSnapstate ? xTree : never;