import { And } from "./and"; import { Decrement } from "./decrement"; import { IfEqual, IsEqual, IsNotEqual } from "./equal"; import { IfGreaterThan } from "./greater-than"; import { If } from "./if"; import { Increment } from "./increment"; import { IsLowerThan } from "./lower-than"; import { Mult } from "./mult"; import { IsNever } from "./never"; import { Abs, IsNegative, IsPositive, Negate, ParseNumber } from "./number"; import { Or } from "./or"; import { IsEmptyString } from "./string"; import { Stringify } from "./stringify"; import { Sub } from "./sub"; type _FindQuotient< Dividend extends number, Divisor extends number, CurrentQuotient extends number > = Mult extends infer Product extends number ? IsEqual extends true ? CurrentQuotient : IsLowerThan extends true ? _FindQuotient> : CurrentQuotient : never; type _Div< Dividend extends string, Divisor extends number, Result extends string = "", CurrentDividend extends string = "", IterationsWithoutDivision extends number = 0, HadFirstDivision extends boolean = false > = Or< IsEmptyString, IsLowerThan, Divisor> > extends true ? IsEmptyString extends true ? ParseNumber< If< And>, `${Result}0`, Result > > : Dividend extends `${infer FirstDigit extends string}${infer Rest extends string}` ? _Div< Rest, Divisor, If< And>, `${Result}0`, Result >, IfEqual< CurrentDividend, "0", FirstDigit, `${CurrentDividend}${FirstDigit}` >, Increment, HadFirstDivision > : never : _FindQuotient< ParseNumber, Divisor, 10 > extends infer Quotient extends number ? IsNever extends true ? ParseNumber : Sub< ParseNumber, Mult > extends infer Remainder extends number ? _Div< Dividend, Divisor, `${Result}${Quotient}`, IfGreaterThan, 0, true > : never : never; /** * Returns integer division of two numbers. Range: `[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]` * @example * ```ts * // 5 * type Case1 = Div<10, 2> * // 2 * type Case2 = Div<7, 3> * ``` */ export type Div = IsEqual< Divisor, 0 > extends true ? never : IsEqual extends true ? 0 : IsEqual extends true ? 1 : IsLowerThan, Abs> extends true ? 0 : _Div< Stringify>, Abs > extends infer Quotient extends number ? If< Or< And, IsNegative>, And, IsPositive> >, Quotient, Negate > : never;