import type { SDivRem as SDivRemNat } from "./Nat/DivRem"; import type { _AddTrailingZeroesToSameLength } from "./internals/_AddTrailingZeroesToSameLength"; import type { _CanStrToLiteralNum } from "./internals/_CanStrToLiteralNum"; import type { _Div10 } from "./internals/_Div10"; import type { _HandleNegativeZero } from "./internals/_HandleNegativeZero"; import type { _RemoveTrailingFractionalZeroes } from "./internals/_RemoveTrailingFractionalZeroes"; import type { _ReplaceAllCharsWithZero } from "./internals/_ReplaceAllCharsWithZero"; import type { _StrToNum } from "./internals/_StrToNum"; /** * Get the quotient and remainder of dividing two `number`s. * * Sign of the remainder is the same as the sign of the dividend. * * Sig: `(n: number, m: number) => number` */ export type DivRem = N extends N ? M extends M ? SDivRem<`${N}`, `${M}`> extends [infer Div extends string, infer Rem extends string] ? [_StrToNum
, _StrToNum] : never : never : never; /** * Get the quotient and remainder of dividing two string representations of `number`s. * * Sign of the remainder is the same as the sign of the dividend. * @private */ export type SDivRem = N extends `-${infer N}` ? M extends `-${infer M}` ? [_SDivRem[0], _HandleNegativeZero<`-${_SDivRem[1]}`>] : [_HandleNegativeZero<`-${_SDivRem[0]}`>, _HandleNegativeZero<`-${_SDivRem[1]}`>] : M extends `-${infer M}` ? [_HandleNegativeZero<`-${_SDivRem[0]}`>, _SDivRem[1]] : _SDivRem; /** * `N`, `M` must be positive numbers. * @private */ type _SDivRem = N extends `${infer NIntPart}.${infer NFracPart}` ? M extends `${infer MIntPart}.${infer MFracPart}` ? SDivRemNat< `${NIntPart extends "0" ? "" : NIntPart}${_AddTrailingZeroesToSameLength}`, `${MIntPart extends "0" ? "" : MIntPart}${_AddTrailingZeroesToSameLength}` > extends [infer Div extends string, infer Rem extends string] ? [Div, _Div10>] : never : SDivRemNat< `${NIntPart extends "0" ? "" : NIntPart}${NFracPart}`, `${M}${_ReplaceAllCharsWithZero}` > extends [infer Div extends string, infer Rem extends string] ? [Div, _Div10] : never : M extends `${infer MIntPart}.${infer MFracPart}` ? SDivRemNat< `${N}${_ReplaceAllCharsWithZero}`, `${MIntPart extends "0" ? "" : MIntPart}${MFracPart}` > extends [infer Div extends string, infer Rem extends string] ? [Div, _Div10] : never : SDivRemNat;