import { AnyRecord } from "../any-record"; import { IsNever } from "../is-never"; type IsUnion = UnionToTuple["length"] extends 1 ? false : true; type UnionToFunctionInsertion = (TUnion extends any ? (arg: () => TUnion) => any : never) extends (arg: infer TParam) => any ? TParam : never; type UnionToTuple = UnionToFunctionInsertion extends () => infer TReturnType ? [...UnionToTuple>, TReturnType] : []; type ExactUnionLength = UnionToTuple["length"] extends UnionToTuple["length"] ? true : false; type BooleanXor = T extends true ? (U extends true ? true : false) : U extends false ? true : false; type BooleanAnd = TTuple extends [infer Head, ...infer Rest] ? Head extends true ? BooleanAnd : false : TTuple extends [] ? true : false; type ObjectKeyExact = BooleanAnd<[ IsNever>, IsNever> ]>; type ObjectValueDiff = { [TKey in keyof TValue]: Exclude; }[keyof TValue]; type ObjectValueExact = BooleanAnd<[ IsNever>, IsNever> ]>; type ObjectExact = [TValue] extends [TShape] ? BooleanAnd<[ BooleanXor, IsUnion>, ExactUnionLength, ObjectKeyExact, ObjectValueExact ]> extends true ? TValue : never : never; type IsArray = [TValue] extends [readonly any[]] ? true : false; type IsReadonly = Readonly extends TArray ? true : false; type SameLength = IsNever> extends true ? false : true; type ArrayExact = BooleanAnd<[ IsArray, IsArray, SameLength, BooleanXor, IsReadonly> ]> extends true ? [TValue, TShape] extends [readonly (infer TValueElement)[], readonly (infer TShapeElement)[]] ? Exact extends TValueElement ? TValue : never : never : never; type PrimitiveExact = [TValue] extends [TShape] ? ([TShape] extends [TValue] ? TValue : never) : never; export type Exact = [TValue] extends [readonly any[]] ? [TShape] extends [readonly any[]] ? ArrayExact : never : [TValue] extends [AnyRecord] ? ObjectExact : PrimitiveExact; export {};