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