import type { SMul as SMulInt } from "./Int/Mul"; 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"; /** * Multiply two numbers. * * Sig: `(n: number, m: number) => number` */ export type Mul = N extends N ? M extends M ? _StrToNum> : never : never; /** * Multiply two string representations of `number`s. * @private */ export type SMul = _TruncateTooLongFractionalPart< N extends `${infer NIntPart}.${infer NFracPart}` ? M extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< SMulInt< _RemoveStrPaddingZeroes<`${NIntPart extends "0" ? "" : NIntPart}${_AddTrailingZeroesToSameLength}`>, _RemoveStrPaddingZeroes<`${MIntPart extends "0" ? "" : MIntPart}${_AddTrailingZeroesToSameLength}`> >, `${_AddTrailingZeroesToSameLength}${_AddTrailingZeroesToSameLength}` > : _Div10< SMulInt< _RemoveStrPaddingZeroes<`${NIntPart extends "0" ? "" : NIntPart}${NFracPart}`>, _RemoveStrPaddingZeroes<`${M}${_ReplaceAllCharsWithZero}`> >, `${NFracPart}${NFracPart}` > : M extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< SMulInt< _RemoveStrPaddingZeroes<`${N}${_ReplaceAllCharsWithZero}`>, _RemoveStrPaddingZeroes<`${MIntPart extends "0" ? "" : MIntPart}${MFracPart}`> >, `${MFracPart}${MFracPart}` > : SMulInt >;