import type { _AddDigit } from "./internals/_AddDigit"; import type { _CompareStrLength } from "./internals/_CompareStrLength"; import type { Digit, GT, Nat } from "../aliases"; import type { _ReverseString } from "../internals/_ReverseString"; import type { _StrToNum } from "../internals/_StrToNum"; /** * Add two {@link Nat}s. * * Sig: `(n: Nat, m: Nat) => Nat` */ export type Add = N extends N ? M extends M ? Nat extends N | M ? Nat : _StrToNum> : never : never; /** * Add two string representations of {@link Nat}s. * @private */ export type SAdd = _CompareStrLength extends GT ? _ReverseString<_SAdd<_ReverseString, _ReverseString>> : _ReverseString<_SAdd<_ReverseString, _ReverseString>>; type _SAdd< N extends string, M extends string, Carry extends 0 | 1 = 0, Result extends string = "", > = N extends `${infer F extends Digit}${infer R}` ? M extends `${infer G extends Digit}${infer S}` ? _AddDigit extends infer D extends Nat ? `${D}` extends `1${infer D extends Digit}` ? _SAdd : D}`> : D extends Digit ? [D, Carry] extends [9, 1] ? _SAdd : _SAdd : D}`> : never : never : Carry extends 1 ? `${Result}${_SAdd}` : `${Result}${N}` : Carry extends 1 ? `${Result}1` : Result;