rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
48 lines (45 loc) • 1.67 kB
TypeScript
import type { Sub as SubInt } from "./Int/Sub";
import type { _AddTrailingZeroesToSameLength } from "./internal/_AddTrailingZeroesToSameLength";
import type { _Div10 } from "./internal/_Div10";
import type { _ReplaceAllCharsWithZero } from "./internal/_ReplaceAllCharsWithZero";
import type { _StrToNum } from "./internal/_StrToNum";
import type { Args, Fn } from "../HKT";
/**
* Subtract two numbers.
*
* Sig: `(n: number, m: number) => number`
*/
export type Sub<N extends number, M extends number> =
`${N}` extends `${infer NIntPart}.${infer NFracPart}` ?
`${M}` extends `${infer MIntPart}.${infer MFracPart}` ?
_Div10<
SubInt<
_StrToNum<`${NIntPart extends "0" ? "" : NIntPart}${_AddTrailingZeroesToSameLength<NFracPart, MFracPart>}`>,
_StrToNum<`${MIntPart extends "0" ? "" : MIntPart}${_AddTrailingZeroesToSameLength<MFracPart, NFracPart>}`>
>,
_AddTrailingZeroesToSameLength<NFracPart, MFracPart>
>
: _Div10<
SubInt<
_StrToNum<`${NIntPart extends "0" ? "" : NIntPart}${NFracPart}`>,
_StrToNum<`${M}${_ReplaceAllCharsWithZero<NFracPart>}`>
>,
NFracPart
>
: `${M}` extends `${infer MIntPart}.${infer MFracPart}` ?
_Div10<
SubInt<
_StrToNum<`${N}${_ReplaceAllCharsWithZero<MFracPart>}`>,
_StrToNum<`${MIntPart extends "0" ? "" : MIntPart}${MFracPart}`>
>,
MFracPart
>
: SubInt<N, M>;
/**
* [Fn] Subtract two numbers.
*
* Sig: `(n: number, m: number) => number`
*/
export default interface SubFn extends Fn<[number, number], number> {
def: ([n, m]: Args<this>) => Sub<typeof n, typeof m>;
}