import { Primitive } from "./types"; export declare type FreezeOnce = T extends Freeze ? Freeze : Freeze; export declare type Freeze = T extends Primitive ? T : T extends [infer H] ? readonly [Freeze] : T extends [infer H, ...infer T] ? readonly [Freeze, ...Freeze] : T extends Map ? ReadonlyMap, Freeze> : T extends ReadonlyMap ? ReadonlyMap, Freeze> : T extends Set ? ReadonlySet> : T extends ReadonlySet ? ReadonlySet> : T extends Function ? T : T extends object ? FreezedObject : T; export declare type FreezedObject = { readonly [K in keyof T]: Freeze; }; export declare type UnFreeze = T extends Primitive ? T : T extends Array ? Array> : T extends Map ? Map, UnFreeze> : T extends ReadonlyMap ? Map, UnFreeze> : T extends Set ? Set> : T extends ReadonlySet ? Set> : T extends Function ? T : T extends object ? UnFreezedObject : T; export declare type UnFreezedObject = { -readonly [K in keyof T]: UnFreeze; }; export declare function freeze(obj: T, runtime?: boolean, deep?: boolean): FreezeOnce; export declare function unfreeze(obj: T): UnFreeze;