/**
 * A utility type to recursively make all properties of a type `T` deeply readonly.
 * - Handles built-in types, objects, arrays, tuples, sets, and maps.
 * - Special cases include skipping class constructors and functions.
 *
 * @template T The type to be made deeply readonly.
 */
export type ReadonlyDeep<T> = T extends BuiltIns ? T : T extends new (...arguments_: any[]) => unknown ? T : T extends (...arguments_: any[]) => unknown ? {} extends ReadonlyObjectDeep<T> ? T : HasMultipleCallSignatures<T> extends true ? T : ((...arguments_: Parameters<T>) => ReturnType<T>) & ReadonlyObjectDeep<T> : T extends Readonly<ReadonlyMap<infer KeyType, infer ValueType>> ? ReadonlyMapDeep<KeyType, ValueType> : T extends Readonly<ReadonlySet<infer ItemType>> ? ReadonlySetDeep<ItemType> : T extends readonly [] | readonly [...never[]] ? readonly [] : T extends readonly [infer U, ...infer V] ? readonly [ReadonlyDeep<U>, ...ReadonlyDeep<V>] : T extends readonly [...infer U, infer V] ? readonly [...ReadonlyDeep<U>, ReadonlyDeep<V>] : T extends ReadonlyArray<infer ItemType> ? ReadonlyArray<ReadonlyDeep<ItemType>> : T extends object ? ReadonlyObjectDeep<T> : unknown;
/**
 * Makes all key-value pairs of a `ReadonlyMap` deeply readonly.
 * @template KeyType Type of the keys in the map.
 * @template ValueType Type of the values in the map.
 */
type ReadonlyMapDeep<KeyType, ValueType> = {} & Readonly<ReadonlyMap<ReadonlyDeep<KeyType>, ReadonlyDeep<ValueType>>>;
/**
 * Makes all elements of a `ReadonlySet` deeply readonly.
 * @template ItemType Type of the items in the set.
 */
type ReadonlySetDeep<ItemType> = {} & Readonly<ReadonlySet<ReadonlyDeep<ItemType>>>;
/**
 * Makes all properties of an object type deeply readonly.
 * @template ObjectType The type of the object to be made deeply readonly.
 */
type ReadonlyObjectDeep<ObjectType extends object> = {
    readonly [KeyType in keyof ObjectType]: ReadonlyDeep<ObjectType[KeyType]>;
};
/**
 * Primitive types that are not recursively transformed.
 */
export type Primitive = null | undefined | string | number | boolean | symbol | bigint;
/**
 * Built-in types that are excluded from recursive transformations.
 */
export type BuiltIns = Primitive | void | Date | RegExp;
/**
 * Utility type to determine if a function type has multiple call signatures.
 * - Used to differentiate simple functions from overloaded functions.
 *
 * @template T The function type to analyze.
 */
type HasMultipleCallSignatures<T extends (...arguments_: any[]) => unknown> = T extends {
    (...arguments_: infer A): unknown;
    (...arguments_: infer B): unknown;
} ? B extends A ? A extends B ? false : true : true : false;
export {};
/**
 * @description Utility for deeply readonly transformations.
 * Adapted from TypeScript type utility libraries.
 * @link https://github.com/sindresorhus/type-fest/blob/main/source/readonly-deep.d.ts
 */
//# sourceMappingURL=types-util.d.ts.map