WIP subtraction/comparison stuff
This commit is contained in:
parent
4d6dd01aea
commit
9a61575d87
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
import { Digit, DigitsToNumber, TupleForDigit } from "."
|
||||
|
||||
type GreaterThan<A extends number, B extends number> = DigitsToNumber<[5]>
|
||||
|
||||
|
||||
type Max<A extends number, B extends number> = never
|
||||
|
||||
type MaxDigitArray<A extends Digit[], B extends Digit[]> =
|
||||
A extends B
|
||||
? A | B
|
||||
: MaxByLength<A, B> extends A | B
|
||||
? MaxDigit<Head<Digit, A>, Head<Digit, B>> extends Head<Digit, A> | Head<Digit, B>
|
||||
? [Head<Digit, A>, ...MaxDigitArray<Tail<Digit, A>, Tail<Digit, B>>]
|
||||
: MaxDigit<Head<Digit, A>, Head<Digit, B>> extends Head<Digit, A>
|
||||
? A
|
||||
: B
|
||||
: MaxByLength<A, B>
|
||||
|
||||
type MaxDigit<A extends Digit, B extends Digit> =
|
||||
MaxByLength<TupleForDigit<A>, TupleForDigit<B>> extends TupleForDigit<A> ? A
|
||||
: MaxByLength<TupleForDigit<A>, TupleForDigit<B>> extends TupleForDigit<A> | TupleForDigit<B> ? A | B
|
||||
: B
|
||||
|
||||
type MaxByLength<A extends any[], B extends any[]> =
|
||||
A['length'] extends B['length'] ? A | B
|
||||
: ToZeros<A> extends [...infer Other, ...ToZeros<B>] ? A
|
||||
: B
|
||||
|
||||
type ToZeros<Tuple extends any[]> = { [Property in keyof Tuple]: 0}
|
||||
|
||||
type HeadTail<Type, Tuple extends Type[]> = Tuple extends [infer Head extends Type, ...infer Tail extends Type[]] ? [Head, Tail] : never
|
||||
|
||||
type Head<Type, Tuple extends Type[]> = Tuple extends [infer Head extends Type, ...Type[]] ? Head : never
|
||||
type Tail<Type, Tuple extends Type[]> = Tuple extends [Type, ...infer Tail extends Type[]] ? Tail : never
|
||||
|
||||
let q: MaxDigitArray<[2, 0, 2], [2, 1]>
|
||||
|
||||
let x: ToZeros<[2, 0]>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from ".";
|
||||
|
||||
export type Add<A extends number, B extends number> = DigitsToNumber<SubtractDigitArrays<SplitDigits<A>, SplitDigits<B>>> & number
|
||||
|
||||
type SubtractDigitArrays<A extends Digit[], B extends Digit[], Carry extends boolean = false> =
|
||||
[A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], [...infer HeadB extends Digit[], infer TailB extends Digit]] ? AddTails<HeadA, TailA, HeadB, TailB, Carry> : [A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], []] ? AddTails<HeadA, TailA, [], 0, Carry> : [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<HeadA extends Digit[], TailA extends Digit, HeadB extends Digit[], TailB extends Digit, Carry extends boolean> =
|
||||
SplitDigits<SubtractDigits<TailA, TailB, Carry>> extends [1, infer Result extends Digit] ? [...AddDigitArrays<HeadA, HeadB, true>, Result] : [...AddDigitArrays<HeadA, HeadB>, SplitDigits<AddDigits<TailA, TailB, Carry>>[0]]
|
||||
|
||||
type SubtractDigits<A extends Digit, B extends Digit, Carry extends boolean = false> =
|
||||
|
||||
[...TupleForDigit<A>, ...TupleForDigit<B>, ...(Carry extends false ? [] : [0])]['length'] & number
|
||||
|
||||
|
||||
Loading…
Reference in New Issue