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 `${infer NIntPart}.${infer NFracPart}` ? `${M}` extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< AddInt< _StrToNum<`${NIntPart extends "0" ? "" : NIntPart}${_AddTrailingZeroesToSameLength}`>, _StrToNum<`${MIntPart extends "0" ? "" : MIntPart}${_AddTrailingZeroesToSameLength}`> >, _AddTrailingZeroesToSameLength > : _Div10< AddInt< _StrToNum<`${NIntPart extends "0" ? "" : NIntPart}${NFracPart}`>, _StrToNum<`${M}${_ReplaceAllCharsWithZero}`> >, NFracPart > : `${M}` extends `${infer MIntPart}.${infer MFracPart}` ? _Div10< AddInt< _StrToNum<`${N}${_ReplaceAllCharsWithZero}`>, _StrToNum<`${MIntPart extends "0" ? "" : MIntPart}${MFracPart}`> >, MFracPart > : AddInt; /** * [Fn] Add two numbers. * * Sig: `(n: number, m: number) => number` */ export default interface AddFn extends Fn<[number, number], number> { def: ([n, m]: Args) => Add; }