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