import { forceExtract, forceToString } from '../../../modules/internals'; import { equals } from '../../../modules/comparison/infrastructure'; import { join, split } from '../../../modules/strings/infrastructure'; import { forceConcat, Pop } from '../../../modules/arrays-and-tuples/app'; import { CarryOnAddition, DecimalHashMap } from '../domain'; export type ToDecimal = forceExtract; type GetSum = forceExtract, B>; type GetSumCarry = B extends forceExtract ? 1 : 0; type sumDecimal = { result: GetSum, CarryIn>; carryOut: $if<(equals & equals), { then: 1; else: GetSumCarry, B>; }>; }; type _next, _shiftedB = Pop, _actualSum = sumDecimal>, ToDecimal>, lastCarryOut>> = MakeAdditionOnTuple, forceExtract<_shiftedB, 'rest'>, forceConcat<[forceExtract<_actualSum, 'result'>], lastIncompleteResult>, forceExtract<_actualSum, 'carryOut'>>; type MakeAdditionOnTuple = A_Digits extends [] ? B_Digits extends [] ? lastCarryOut extends 0 ? lastIncompleteResult : forceConcat<[lastCarryOut], lastIncompleteResult> : _next : _next; export type InternalAdd = join>, split>>> extends `${infer x extends number}` ? x : never; export {};