/**
* 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 };