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 DeepReadonly = T extends Builtin ? T : T extends Map ? ReadonlyMap, DeepReadonly> : T extends ReadonlyMap ? ReadonlyMap, DeepReadonly> : T extends WeakMap ? WeakMap, DeepReadonly> : T extends Set ? ReadonlySet> : T extends ReadonlySet ? ReadonlySet> : T extends WeakSet ? WeakSet> : T extends Promise ? Promise> : T extends AnyArray ? T extends IsTuple ? { readonly [K in keyof T]: DeepReadonly; } : ReadonlyArray> : T extends {} ? { readonly [K in keyof T]: DeepReadonly; } : IsUnknown extends true ? unknown : Readonly;