40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
|
|
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]>
|