diff --git a/src/Max.ts b/src/Max.ts new file mode 100644 index 0000000..21b1b9b --- /dev/null +++ b/src/Max.ts @@ -0,0 +1,34 @@ + +import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from "." + +export type Max = DigitsToNumber, SplitDigits>> & number + +export function max(a: A, b: B) { + return Math.max(a, b) as Max +} + +type MaxDigitArray = + A extends B + ? A | B + : A['length'] extends B['length'] + ? Head extends Head + ? [Head, ...MaxDigitArray, Tail>] + : MaxDigit, Head> extends Head + ? A + : B + : MaxByLength + +type MaxDigit = + MaxByLength, TupleForDigit> extends TupleForDigit ? A + : A extends B ? 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 Head = Tuple extends [infer Head extends Type, ...Type[]] ? Head : never +type Tail = Tuple extends [Type, ...infer Tail extends Type[]] ? Tail : never 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 + + diff --git a/src/index.ts b/src/index.ts index 5fc09d7..6463a81 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,5 +40,3 @@ type Join = : never export type DigitsToNumber = StringToNumber> - -