import { BuildTuple, IsEqual } from "./base.cjs"; import { IsNegative, NegativeInfinity, PositiveInfinity } from "./number.cjs"; import { StringLength, StringToNumber } from "./string.cjs"; //#region src/logic.d.ts /** * Returns a boolean for whether A is false. * * @example * ``` * Not; * //=> false * * Not; * //=> true * ``` */ type Not = A extends true ? false : A extends false ? true : never; /** * Returns a boolean for whether the given `boolean` is not `false`. */ type IsNotFalse = [T] extends [false] ? false : true; type Or = [A, B][number] extends false ? false : true extends [IsEqual, IsEqual][number] ? true : never; type And = [A, B][number] extends true ? true : true extends [IsEqual, IsEqual][number] ? false : never; /** * Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both positive numeric characters. * * @example * ``` * PositiveNumericCharacterGt<'5', '1'>; * //=> true * * PositiveNumericCharacterGt<'1', '1'>; * //=> false * ``` */ type PositiveNumericCharacterGt = NumericString extends `${infer HeadA}${A}${infer _TailA}` ? NumericString extends `${infer HeadB}${B}${infer _TailB}` ? HeadA extends `${HeadB}${infer _}${infer __}` ? true : false : never : never; /** * Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both numeric strings and have the same length. * * @example * ``` * SameLengthPositiveNumericStringGt<'50', '10'>; * //=> true * * SameLengthPositiveNumericStringGt<'10', '10'>; * //=> false * ``` */ type SameLengthPositiveNumericStringGt = A extends `${infer FirstA}${infer RestA}` ? B extends `${infer FirstB}${infer RestB}` ? FirstA extends FirstB ? SameLengthPositiveNumericStringGt : PositiveNumericCharacterGt : never : false; type NumericString = "0123456789"; /** * Returns a boolean for whether `A` is greater than `B`, where `A` and `B` are both positive numeric strings. * * @example * ``` * PositiveNumericStringGt<'500', '1'>; * //=> true * * PositiveNumericStringGt<'1', '1'>; * //=> false * * PositiveNumericStringGt<'1', '500'>; * //=> false * ``` */ type PositiveNumericStringGt = A extends B ? false : [BuildTuple, 0>, BuildTuple, 0>] extends infer R extends [readonly unknown[], readonly unknown[]] ? R[0] extends [...R[1], ...infer Remain extends readonly unknown[]] ? 0 extends Remain["length"] ? SameLengthPositiveNumericStringGt : true : false : never; type LessThan = number extends A | B ? never : GreaterThanOrEqual extends true ? false : true; type GreaterThan = number extends A | B ? never : [IsEqual, IsEqual, IsEqual, IsEqual] extends infer R extends [boolean, boolean, boolean, boolean] ? Or, IsEqual>, And, IsEqual>> extends true ? true : Or, IsEqual>, And, IsEqual>> extends true ? false : true extends R[number] ? false : [IsNegative, IsNegative] extends infer R extends [boolean, boolean] ? [true, false] extends R ? false : [false, true] extends R ? true : [false, false] extends R ? PositiveNumericStringGt<`${A}`, `${B}`> : PositiveNumericStringGt<`${NumberAbsolute}`, `${NumberAbsolute}`> : never : never; type GreaterThanOrEqual = number extends A | B ? never : A extends B ? true : GreaterThan; /** * Returns the minimum value from a tuple of integers. * * Note: * - Float numbers are not supported. * * @example * ``` * ArrayMin<[1, 2, 5, 3]>; * //=> 1 * * ArrayMin<[1, 2, 5, 3, -5]>; * //=> -5 * ``` */ type ArrayMin = number extends A[number] ? never : A extends [infer F extends number, ...infer R extends number[]] ? LessThan extends true ? ArrayMin : ArrayMin : Result; /** * Returns the maximum value from a tuple of integers. * * Note: * - Float numbers are not supported. * * @example * ``` * ArrayMax<[1, 2, 5, 3]>; * //=> 5 * * ArrayMax<[1, 2, 5, 3, 99, -1]>; * //=> 99 * ``` */ type ArrayMax = number extends A[number] ? never : A extends [infer F extends number, ...infer R extends number[]] ? GreaterThan extends true ? ArrayMax : ArrayMax : Result; /** * Returns the absolute value of a given value. * * @example * ``` * NumberAbsolute<-1>; * //=> 1 * * NumberAbsolute<1>; * //=> 1 * * NumberAbsolute * //=> PositiveInfinity * ``` */ type NumberAbsolute = `${N}` extends `-${infer StringPositiveN}` ? StringToNumber : N; type Subtract = number extends A | B ? number : [IsEqual, IsEqual, IsEqual, IsEqual] extends infer R extends [boolean, boolean, boolean, boolean] ? Or, IsEqual>, And, IsEqual>> extends true ? PositiveInfinity : Or, IsEqual>, And, IsEqual>> extends true ? NegativeInfinity : true extends R[number] ? number : [IsNegative, IsNegative] extends infer R ? [false, false] extends R ? BuildTuple extends infer _R ? R extends [...BuildTuple, ...infer R] ? R["length"] : number : never : LessThan extends true ? number : [false, true] extends R ? Sum> : Subtract, NumberAbsolute> : never : never; type Sum = number extends A | B ? number : [IsEqual, IsEqual, IsEqual, IsEqual] extends infer R extends [boolean, boolean, boolean, boolean] ? Or, IsEqual>, And, IsEqual>> extends true ? PositiveInfinity : Or, IsEqual>, And, IsEqual>> extends true ? NegativeInfinity : true extends R[number] ? number : ([IsNegative, IsNegative] extends infer R ? [false, false] extends R ? [...BuildTuple, ...BuildTuple]["length"] : [true, true] extends R ? number : ArrayMax<[NumberAbsolute, NumberAbsolute]> extends infer Max_ ? ArrayMin<[NumberAbsolute, NumberAbsolute]> extends infer Min_ extends number ? Max_ extends A | B ? Subtract : number : never : never : never) & number : never; //#endregion export { And, ArrayMax, ArrayMin, GreaterThan, GreaterThanOrEqual, IsNotFalse, LessThan, Not, NumberAbsolute, Or, PositiveNumericCharacterGt, PositiveNumericStringGt, SameLengthPositiveNumericStringGt, Subtract, Sum }; //# sourceMappingURL=logic.d.cts.map