UNPKG

rivo

Version:

🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.

48 lines (45 loc) • 1.66 kB
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>; }