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