import { IsEqual } from "./equal"; import { Increment } from "./increment"; import { Mult } from "./mult"; import { IsNegative } from "./number"; type _Factorial< T extends number, CurrentNum extends number = 1, CurrentProduct extends number = 1 > = IsEqual extends true ? Mult : _Factorial, Mult>; /** * Accepts an integer argument and returns it mathematical factorial. Range: [0, 21] * @example * // 0 * type Case1 = Factorial<0> * // 720 * type Case1 = Factorial<6> */ export type Factorial = number extends T ? never : IsNegative extends true ? never : IsEqual extends true ? 1 : _Factorial;