export type Primitive = bigint | boolean | number | string | symbol | null | undefined; export type Builtin = Date | Error | Function | Primitive | RegExp; export type IsTuple = T extends any[] ? (any[] extends T ? never : T) : never; export type IsAny = 0 extends T & 1 ? true : false; export type IsUnknown = IsAny extends true ? false : unknown extends T ? true : false; export type AnyArray = Array | ReadonlyArray; export type DeepWritable = T extends Builtin ? T : T extends ReadonlyMap ? Map, DeepWritable> : T extends Map ? Map, DeepWritable> : T extends WeakMap ? WeakMap, DeepWritable> : T extends ReadonlySet ? Set> : T extends Set ? Set> : T extends WeakSet ? WeakSet> : T extends Promise ? Promise> : T extends AnyArray ? T extends IsTuple ? { -readonly [K in keyof T]: DeepWritable; } : Array> : T extends {} ? { -readonly [K in keyof T]: DeepWritable; } : IsUnknown extends true ? unknown : T;