// ============================================================================ // Helpers // ============================================================================ type InternalBuildArray< N extends number, Acc extends readonly unknown[] = [], > = Acc["length"] extends N ? Acc : InternalBuildArray type InternalIsGreaterThan = A extends B ? false : InternalBuildArray extends [...InternalBuildArray, ...infer _Rest] ? _Rest extends [unknown, ...unknown[]] ? true : false : false // ============================================================================ // Primitives // ============================================================================ /** * @description Conditional type selector based on a boolean value (ternary operator). * * @example * ``` * // Expect: 'yes' * type Example1 = BooleanIf * // Expect: 'no' * type Example2 = BooleanIf * ``` */ export type BooleanIf = Condition extends true ? Then : Else // ============================================================================ // Comparison // ============================================================================ /** * @description Check if two boolean values are equal. * * @example * ``` * // Expect: true * type Example1 = BooleanIsEqual * // Expect: true * type Example2 = BooleanIsEqual * // Expect: false * type Example3 = BooleanIsEqual * ``` */ export type BooleanIsEqual = T extends U ? U extends T ? true : false : false /** * @description Logical implication (A → B), equivalent to ¬A ∨ B. * * @example * ``` * // Expect: true * type Example1 = BooleanImplies * // Expect: false * type Example2 = BooleanImplies * // Expect: true * type Example3 = BooleanImplies * // Expect: true * type Example4 = BooleanImplies * ``` */ export type BooleanImplies = T extends true ? U extends true ? true : false : true // ============================================================================ // Query // ============================================================================ type InternalBooleanCountTrue< T extends readonly boolean[], Acc extends readonly unknown[] = [], > = T extends [infer First extends boolean, ...infer Rest extends boolean[]] ? First extends true ? InternalBooleanCountTrue : InternalBooleanCountTrue : Acc["length"] /** * @description Count the number of true values in a boolean tuple. * * @example * ``` * // Expect: 2 * type Example1 = BooleanCountTrue<[true, false, true]> * // Expect: 0 * type Example2 = BooleanCountTrue<[false, false]> * ``` */ export type BooleanCountTrue = InternalBooleanCountTrue type InternalBooleanCountFalse< T extends readonly boolean[], Acc extends readonly unknown[] = [], > = T extends [infer First extends boolean, ...infer Rest extends boolean[]] ? First extends false ? InternalBooleanCountFalse : InternalBooleanCountFalse : Acc["length"] /** * @description Count the number of false values in a boolean tuple. * * @example * ``` * // Expect: 2 * type Example1 = BooleanCountFalse<[true, false, false]> * // Expect: 0 * type Example2 = BooleanCountFalse<[true, true]> * ``` */ export type BooleanCountFalse = InternalBooleanCountFalse /** * @description Count the number of true or false values in a boolean tuple. * * @example * ``` * // Expect: 2 * type Example1 = BooleanCount<[true, false, true], true> * // Expect: 1 * type Example2 = BooleanCount<[true, false, true], false> * ``` */ export type BooleanCount = Value extends true ? BooleanCountTrue : BooleanCountFalse type InternalBooleanFindIndex< T extends readonly boolean[], Value extends boolean, Index extends readonly unknown[] = [], > = T extends [infer First extends boolean, ...infer Rest extends boolean[]] ? First extends Value ? Index["length"] : InternalBooleanFindIndex : -1 /** * @description Find the index of the first occurrence of a boolean value in a tuple. * * @example * ``` * // Expect: 1 * type Example1 = BooleanFindIndex<[false, true, false], true> * // Expect: 0 * type Example2 = BooleanFindIndex<[false, true, false], false> * // Expect: -1 * type Example3 = BooleanFindIndex<[false, false], true> * ``` */ export type BooleanFindIndex< T extends readonly boolean[], Value extends boolean, > = InternalBooleanFindIndex // ============================================================================ // Manipulation // ============================================================================ /** * @description Logical NOT operation. * * @example * ``` * // Expect: true * type Example1 = BooleanNot * // Expect: false * type Example2 = BooleanNot * ``` */ export type BooleanNot = T extends true ? false : true /** * @description Logical AND operation. * * @example * ``` * // Expect: true * type Example1 = BooleanAnd * // Expect: false * type Example2 = BooleanAnd * // Expect: false * type Example3 = BooleanAnd * // Expect: false * type Example4 = BooleanAnd * ``` */ export type BooleanAnd = T extends true ? U extends true ? true : false : false /** * @description Logical NAND operation (NOT AND). * * @example * ``` * // Expect: false * type Example1 = BooleanNand * // Expect: true * type Example2 = BooleanNand * // Expect: true * type Example3 = BooleanNand * // Expect: true * type Example4 = BooleanNand * ``` */ export type BooleanNand = T extends true ? U extends true ? false : true : true /** * @description Logical OR operation. * * @example * ``` * // Expect: true * type Example1 = BooleanOr * // Expect: false * type Example2 = BooleanOr * // Expect: true * type Example3 = BooleanOr * // Expect: true * type Example4 = BooleanOr * ``` */ export type BooleanOr = T extends true ? true : U extends true ? true : false /** * @description Logical NOR operation (NOT OR). * * @example * ``` * // Expect: false * type Example1 = BooleanNor * // Expect: true * type Example2 = BooleanNor * // Expect: false * type Example3 = BooleanNor * // Expect: false * type Example4 = BooleanNor * ``` */ export type BooleanNor = T extends true ? false : U extends true ? false : true /** * @description Logical XOR operation (exclusive OR). * * @example * ``` * // Expect: true * type Example1 = BooleanXor * // Expect: false * type Example2 = BooleanXor * // Expect: true * type Example3 = BooleanXor * // Expect: false * type Example4 = BooleanXor * ``` */ export type BooleanXor = T extends true ? U extends true ? false : true : U extends true ? true : false /** * @description Logical XNOR operation (exclusive NOR). * * @example * ``` * // Expect: false * type Example1 = BooleanXnor * // Expect: true * type Example2 = BooleanXnor * // Expect: false * type Example3 = BooleanXnor * // Expect: true * type Example4 = BooleanXnor * ``` */ export type BooleanXnor = T extends true ? U extends true ? true : false : U extends true ? false : true /** * @description Check if all boolean values in a tuple are true. * * @example * ``` * // Expect: true * type Example1 = BooleanAll<[true, true, true]> * // Expect: false * type Example2 = BooleanAll<[true, false, true]> * // Expect: true * type Example3 = BooleanAll<[]> * ``` */ export type BooleanAll = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? First extends true ? BooleanAll : false : true /** * @description Alias for BooleanAll. */ export type BooleanEvery = BooleanAll /** * @description Check if any boolean value in a tuple is true. * * @example * ``` * // Expect: true * type Example1 = BooleanAny<[false, true, false]> * // Expect: false * type Example2 = BooleanAny<[false, false, false]> * // Expect: false * type Example3 = BooleanAny<[]> * ``` */ export type BooleanAny = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? First extends true ? true : BooleanAny : false /** * @description Alias for BooleanAny. */ export type BooleanSome = BooleanAny /** * @description Check if all boolean values in a tuple are false. * * @example * ``` * // Expect: true * type Example1 = BooleanNone<[false, false, false]> * // Expect: false * type Example2 = BooleanNone<[false, true, false]> * // Expect: true * type Example3 = BooleanNone<[]> * ``` */ export type BooleanNone = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? First extends false ? BooleanNone : false : true /** * @description Filter a boolean tuple to keep only specified value (true or false). * * @example * ``` * // Expect: [true, true] * type Example1 = BooleanFilter<[true, false, true, false], true> * // Expect: [false, false] * type Example2 = BooleanFilter<[true, false, true, false], false> * ``` */ export type BooleanFilter = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? First extends Value ? [First, ...BooleanFilter] : BooleanFilter : [] /** * @description Map a boolean tuple by applying NOT operation to each element. * * @example * ``` * // Expect: [false, true, false] * type Example1 = BooleanMapNot<[true, false, true]> * ``` */ export type BooleanMapNot = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? [BooleanNot, ...BooleanMapNot] : [] type InternalBooleanReverse< T extends readonly boolean[], Acc extends readonly boolean[] = [], > = T extends [infer First extends boolean, ...infer Rest extends boolean[]] ? InternalBooleanReverse : Acc /** * @description Reverse a boolean tuple. * * @example * ``` * // Expect: [false, true, true] * type Example1 = BooleanReverse<[true, true, false]> * ``` */ export type BooleanReverse = InternalBooleanReverse /** * @description Partition a boolean tuple into two groups: true values and false values. * * @example * ``` * // Expect: [[true, true], [false, false]] * type Example1 = BooleanPartition<[true, false, true, false]> * ``` */ export type BooleanPartition = [ BooleanFilter, BooleanFilter, ] /** * @description Majority function - returns true if more than half of the values are true. * * @example * ``` * // Expect: true * type Example1 = BooleanMajority<[true, true, false]> * // Expect: false * type Example2 = BooleanMajority<[true, false, false]> * // Expect: false * type Example3 = BooleanMajority<[true, false]> * ``` */ export type BooleanMajority = BooleanCountTrue extends infer TrueCount extends number ? T["length"] extends infer Total extends number ? TrueCount extends 0 ? false : Total extends 0 ? false : // Compare TrueCount * 2 > Total by building arrays [ ...InternalBuildArray, ...InternalBuildArray, ]["length"] extends infer Double extends number ? InternalIsGreaterThan extends true ? true : false : false : false : false /** * @description Parity function - returns true if an odd number of values are true. * * @example * ``` * // Expect: true * type Example1 = BooleanParity<[true, false, false]> * // Expect: false * type Example2 = BooleanParity<[true, true, false]> * // Expect: true * type Example3 = BooleanParity<[true]> * ``` */ export type BooleanParity = T extends [ infer First extends boolean, ...infer Rest extends boolean[], ] ? First extends true ? BooleanNot> : BooleanParity : false /** * @description Threshold function - returns true if at least N values are true. * * @example * ``` * // Expect: true * type Example1 = BooleanThreshold<[true, true, false], 2> * // Expect: false * type Example2 = BooleanThreshold<[true, false, false], 2> * // Expect: true * type Example3 = BooleanThreshold<[true, true, true], 2> * ``` */ export type BooleanThreshold = BooleanCountTrue extends infer TrueCount extends number ? InternalBuildArray extends [...InternalBuildArray, ...unknown[]] ? true : false : false // ============================================================================ // Boolean Conversion // ============================================================================ /** * @description Convert a boolean value to a number literal (true → 1, false → 0). * * @example * ``` * // Expect: 1 * type Example1 = BooleanToNumber * // Expect: 0 * type Example2 = BooleanToNumber * ``` */ export type BooleanToNumber = T extends true ? 1 : 0 /** * @description Convert a boolean value to a string literal. * * @example * ``` * // Expect: 'true' * type Example1 = BooleanToString * // Expect: 'false' * type Example2 = BooleanToString * ``` */ export type BooleanToString = T extends true ? "true" : "false"