/** * Creating an an observable array */ export interface ObservableArray { observable: Observable; observe: (observer: Observer) => void; unobserve: (observers?: Observer | Observer[]) => Promise[]>; silently: (work: (o: Observable) => any) => void; } type Observable = T & { [oMetaKey]: OMetaBase; }; type ChangeType = "insert" | "update" | "delete" | "reverse" | "shuffle"; type PrepareFunction = (source: T, oMeta: OMetaBase, visited: Set) => Observable; interface MetaProperties { target: T; ownKey: symbol | number | string; parent: any | null; visited?: Set; } interface Observer { (changes: Change[]): void; } declare const oMetaKey: unique symbol; declare class Change { type: ChangeType; path: (string | number | symbol)[]; value?: any; oldValue?: any; object: any; snapshot: T; constructor(type: ChangeType, path: (string | number | symbol)[], value: any | undefined, oldValue: any | undefined, object: T, snapshot: T); } declare class OMetaBase { parent: any; ownKey: string | number | symbol; observers: Observer[]; revocable: { proxy: Observable; revoke: () => void; }; proxy: Observable; target: T; batches: [Observer, Change[]][]; constructor(properties: MetaProperties, cloningFunction: PrepareFunction); detach(): T; set(target: T, key: number | string | symbol, value: any): boolean; deleteProperty(target: Observable, key: string | symbol): boolean; } declare function observable(target: A | Observable): ObservableArray; declare function isObservable(input: T): boolean; export { observable, isObservable, Change };