import { EventEmitter } from './emitter'; export declare type KeyOf = T extends object ? string & keyof T : never; export declare type ModelEvents = { [K in KeyOf | '@updated']: K extends '@updated' ? Array> : K extends KeyOf ? { value: T[K]; previousValue: T[K]; } : never; }; interface Readable { get>(key: K): T[K]; } interface Writable extends Readable { set>(key: K, value: T[K]): void; setAll(state: Partial): void; } declare type Immutable = T extends Array ? ReadonlyArray> : T extends Set ? ReadonlySet> : T extends Map ? ReadonlyMap> : T extends Date | Function | RegExp ? T : T extends object ? { readonly [K in keyof T]: Immutable; } : T; export declare type Model = T & Writable & EventEmitter>; export declare type ReadonlyModel = Immutable & Readable & EventEmitter>; export declare function createModel(state: T): Model; export declare function readonly(model: Model): ReadonlyModel; export {}; //# sourceMappingURL=model.d.ts.map