diff --git a/src/Comparison.ts b/src/Comparison.ts new file mode 100644 index 0000000..6ce507b --- /dev/null +++ b/src/Comparison.ts @@ -0,0 +1,39 @@ + +import { Digit, DigitsToNumber, TupleForDigit } from "." + +type GreaterThan = DigitsToNumber<[5]> + + +type Max = never + +type MaxDigitArray = + A extends B + ? A | B + : MaxByLength extends A | B + ? MaxDigit, Head> extends Head | Head + ? [Head, ...MaxDigitArray, Tail>] + : MaxDigit, Head> extends Head + ? A + : B + : MaxByLength + +type MaxDigit = + MaxByLength, TupleForDigit> extends TupleForDigit ? A + : MaxByLength, TupleForDigit> extends TupleForDigit | TupleForDigit ? A | B + : B + +type MaxByLength = + A['length'] extends B['length'] ? A | B + : ToZeros extends [...infer Other, ...ToZeros] ? A + : B + +type ToZeros = { [Property in keyof Tuple]: 0} + +type HeadTail = Tuple extends [infer Head extends Type, ...infer Tail extends Type[]] ? [Head, Tail] : never + +type Head = Tuple extends [infer Head extends Type, ...Type[]] ? Head : never +type Tail = Tuple extends [Type, ...infer Tail extends Type[]] ? Tail : never + +let q: MaxDigitArray<[2, 0, 2], [2, 1]> + +let x: ToZeros<[2, 0]> diff --git a/src/Subraction.ts b/src/Subraction.ts new file mode 100644 index 0000000..7e50931 --- /dev/null +++ b/src/Subraction.ts @@ -0,0 +1,15 @@ +import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from "."; + +export type Add = DigitsToNumber, SplitDigits>> & number + +type SubtractDigitArrays = + [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 SubtractTails = + SplitDigits> extends [1, infer Result extends Digit] ? [...AddDigitArrays, Result] : [...AddDigitArrays, SplitDigits>[0]] + +type SubtractDigits = + + [...TupleForDigit, ...TupleForDigit, ...(Carry extends false ? [] : [0])]['length'] & number + +