import type { SSub as SSubInt } from "./Int/Sub"; import type { _RemoveStrPaddingZeroes } from "./Nat/internals/_RemoveStrPaddingZeroes"; import type { _AddTrailingZeroesToSameLength } from "./internals/_AddTrailingZeroesToSameLength"; import type { _Div10 } from "./internals/_Div10"; import type { _ReplaceAllCharsWithZero } from "./internals/_ReplaceAllCharsWithZero"; import type { _StrToNum } from "./internals/_StrToNum"; import type { _TruncateTooLongFractionalPart } from "./internals/_TruncateTooLongFractionalPart"; /** * Subtract two numbers. * * Sig: `(n: number, m: number) => number` */ export type Sub = N extends N ? M extends M ? _StrToNum> : never : never; /** * Subtract two string representations of `number`s. * @private */ export type SSub = _TruncateTooLongFractionalPart< N extends `${infer NIntPart}.${infer NFracPart}` ? M extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< SSubInt< _RemoveStrPaddingZeroes<`${NIntPart extends "0" ? "" : NIntPart}${_AddTrailingZeroesToSameLength}`>, _RemoveStrPaddingZeroes<`${MIntPart extends "0" ? "" : MIntPart}${_AddTrailingZeroesToSameLength}`> >, _AddTrailingZeroesToSameLength > : _Div10< SSubInt< _RemoveStrPaddingZeroes<`${NIntPart extends "0" ? "" : NIntPart}${NFracPart}`>, _RemoveStrPaddingZeroes<`${M}${_ReplaceAllCharsWithZero}`> >, NFracPart > : M extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< SSubInt< _RemoveStrPaddingZeroes<`${N}${_ReplaceAllCharsWithZero}`>, _RemoveStrPaddingZeroes<`${MIntPart extends "0" ? "" : MIntPart}${MFracPart}`> >, MFracPart > : SSubInt >;