import type { Digit } from "../utils"; type AddDigitTable = [ [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ], [ 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 ], [ 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 ], [ 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 ], [ 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 ], [ 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 ], [ 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 ], [ 8, 9, 0, 1, 2, 3, 4, 5, 6, 7 ], [ 9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ] ], [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ], [ 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 ], [ 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 ], [ 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 ], [ 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 ], [ 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 ], [ 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 ], [ 8, 9, 0, 1, 2, 3, 4, 5, 6, 7 ], [ 9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] ] ]; type AddDigitCarryTable = [ [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ], [ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ], [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 ], [ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ], [ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 ], [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ], [ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ], [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ], [ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ], [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 ], [ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ], [ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 ], [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ], [ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ] ]; type AddDigit = AddDigitTable[Carry][T][U]; type AddCarryDigit = AddDigitCarryTable[Carry][T][U]; export type AddDigits = T extends [...infer R extends Digit[], infer N extends Digit] ? U extends [...infer S extends Digit[], infer M extends Digit] ? AddDigits, [ AddDigit, ...Acc ]> : AddDigits, [ AddDigit, ...Acc ]> : U extends [...infer S extends Digit[], infer M extends Digit] ? AddDigits<[ ], S, AddCarryDigit<0, M, Carry>, [ AddDigit<0, M, Carry>, ...Acc ]> : Carry extends 1 ? [1, ...Acc] : Acc; export {};