import { DigitsToNumber, SplitDigits, Digit, TupleForDigit } from "."; export type Add = DigitsToNumber, SplitDigits>> & number type AddDigitArrays = [A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], [...infer HeadB extends Digit[], infer TailB extends Digit]] ? AddTails : [A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], []] ? AddTails : [A, B] extends [[], [...infer HeadB extends Digit[], infer TailB extends Digit]] ? AddTails<[], 0, HeadB, TailB, Carry> : [A, B] extends [[], []] ? Carry extends true ? [1] : [] : [] type AddTails = SplitDigits> extends [1, infer Result extends Digit] ? [...AddDigitArrays, Result] : [...AddDigitArrays, SplitDigits>[0]] type AddDigits = [...TupleForDigit, ...TupleForDigit, ...(Carry extends false ? [] : [0])]['length'] & number export function add(a: A, b: B) { return a + b as Add }