import type { _AddDigit } from "./internals/_AddDigit"; import type { _CompareDigit } from "./internals/_CompareDigit"; import type { _RemoveStrPaddingZeroes } from "./internals/_RemoveStrPaddingZeroes"; import type { _SubDigit } from "./internals/_SubDigit"; import type { Digit, EQ, GT, Nat } from "../aliases"; import type { _ReverseString } from "../internals/_ReverseString"; import type { _StrToNum } from "../internals/_StrToNum"; /** * Subtract two {@link Nat}s. * * Sig: `(n: Nat, m: Nat) => Nat` * * **⚠️ Warning:** `N` must be greater than or equal to `M`. */ export type Sub = N extends N ? M extends M ? Nat extends N | M ? Nat : _StrToNum> : never : never; /** * Subtract two string representations of {@link Nat}s. * * **⚠️ Warning:** `N` must be greater than or equal to `M`. * @private */ export type SSub = _RemoveStrPaddingZeroes< _ReverseString<_SSub<_ReverseString, _ReverseString>> >; type _SSub< N extends string, M extends string, Borrow extends 0 | 1 = 0, Result extends string = "", > = N extends `${infer F extends Digit}${infer R}` ? M extends `${infer G extends Digit}${infer S}` ? Borrow extends 0 ? _CompareDigit extends EQ | GT ? _SSub}`> : // prettier-ignore _SSub, 1> extends infer U extends Digit ? U : never, F>}`> : F extends 0 ? _SSub}`> : _CompareDigit<_SubDigit, G> extends EQ | GT ? _SSub, G>}`> : // prettier-ignore _SSub, F>}`> : Borrow extends 1 ? `${Result}${_SSub}` : `${Result}${N}` : Borrow extends 1 ? `${Result}1` : Result;