import { IsEmptyArray } from "./array"; import { IsTuple } from "./is-tuple"; import { IfLowerThan } from "./lower-than"; import { ReturnItselfIfNotExtends } from "./return-itself-if-extends"; import { Shift } from "./shift"; /** * Accepts two integers and returns the maximum among them. Range: `[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]` * @example * ```ts * // 10 * type Case1 = Max<1, 10> * // 1 * type Case2 = Max<1, -10> * ``` */ export type Max = IfLowerThan< Num1, Num2, Num2, Num1 >; type _MaxArr< T extends readonly number[], CurrentMax extends number = ReturnItselfIfNotExtends > = IsEmptyArray extends true ? CurrentMax : Shift extends [ infer Rest extends number[], infer First extends number ] ? _MaxArr> : never; /** * Accepts an array of integers and returns the maximum among its elements. Range: `[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]` * @example * ```ts * // 10 * type Case1 = MaxArr<[1, 2, 4, 10]> * // 4 * type Case2 = MaxArr<[-1, 4, -10]> * ``` */ export type MaxArr = IsTuple extends true ? _MaxArr : never;