Skip to content
This repository was archived by the owner on Aug 3, 2023. It is now read-only.

Commit 0b37aaa

Browse files
committed
Adapt to TypeScript 4.1
1 parent c1e8d9b commit 0b37aaa

File tree

1 file changed

+54
-107
lines changed

1 file changed

+54
-107
lines changed

lib/utils.ts

Lines changed: 54 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,31 @@
1-
export type IsFinite<Tuple extends any[], Finite, Infinite> = {
2-
empty: Finite
3-
nonEmpty: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Rest) => any)
1+
export type IsFinite<Tuple extends any[], Finite, Infinite> =
2+
Tuple extends [] ? Finite :
3+
Tuple extends Array<infer Element> ?
4+
Element[] extends Tuple ?
5+
Infinite
6+
: Tuple extends [any, ...infer Rest]
47
? IsFinite<Rest, Finite, Infinite>
58
: never
6-
infinite: Infinite
7-
}[
8-
Tuple extends [] ? 'empty' :
9-
Tuple extends (infer Element)[] ?
10-
Element[] extends Tuple ?
11-
'infinite'
12-
: 'nonEmpty'
139
: never
14-
]
1510

16-
export type _SplitInfiniteTuple<Tuple extends any[], Holder extends any[] = []> = {
17-
matched: [Holder, Tuple]
18-
unmatched: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Rest) => any)
19-
? _SplitInfiniteTuple<Rest, Prepend<Holder, First>>
20-
: never
21-
finite: [Tuple, []]
22-
}[
23-
Tuple extends (infer Element)[] ?
24-
Element[] extends Tuple ? 'matched' : 'unmatched'
11+
export type _SplitInfiniteTuple<Tuple extends any[], Holder extends any[] = []> =
12+
Tuple extends Array<infer Element> ?
13+
Element[] extends Tuple ? [Tuple, Holder] :
14+
Tuple extends [infer First, ...infer Rest] ?
15+
_SplitInfiniteTuple<Rest, Prepend<Holder, First>>
16+
: never
2517
: never
26-
]
2718

2819
export type First<Tuple extends any[], Default = never> =
2920
Tuple extends [any, ...any[]] ? Tuple[0] : Default
3021

31-
export type Last<Tuple extends any[], Default = never> = {
32-
empty: Default
33-
single: Tuple extends [infer SoleElement] ? SoleElement : never
34-
multi: ((..._: Tuple) => any) extends ((_: any, ..._1: infer Next) => any) ? Last<Next> : Default
35-
infinite: Tuple extends (infer Element)[] ? Element : never
36-
}[
37-
Tuple extends [] ? 'empty' :
38-
Tuple extends [any] ? 'single' :
39-
Tuple extends (infer Element)[]
40-
? Element[] extends Tuple ? 'infinite'
41-
: 'multi'
22+
export type Last<Tuple extends any[], Default = never> =
23+
Tuple extends [] ? Default :
24+
Tuple extends [infer SoleElement] ? SoleElement :
25+
Tuple extends Array<infer Element> ?
26+
Element[] extends Tuple ? Element :
27+
Tuple extends [any, ...infer Next] ? Last<Next> : Default
4228
: never
43-
]
4429

4530
export type Tail<Tuple extends any[]> =
4631
((...args: Tuple) => any) extends ((_: any, ..._1: infer Rest) => any)
@@ -51,7 +36,7 @@ export type Prepend<Tuple extends any[], Addend> = [Addend, ...Tuple]
5136

5237
export type Reverse<Tuple extends any[], Prefix extends any[] = []> = {
5338
empty: Prefix,
54-
nonEmpty: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Next) => any)
39+
nonEmpty: Tuple extends [infer First, ...infer Next]
5540
? Reverse<Next, Prepend<Prefix, First>>
5641
: never
5742
infinite: {
@@ -68,23 +53,18 @@ export type Concat<Left extends any[], Right extends any[]> = [...Left, ...Right
6853

6954
export type Repeat<Type, Count extends number, Holder extends any[] = []> =
7055
Count extends never ? never :
71-
number extends Count
72-
? Type[]
73-
: {
74-
fit: Holder
75-
unfit: Repeat<Type, Count, Prepend<Holder, Type>>
76-
union: Count extends Holder['length'] | infer Rest ?
77-
Rest extends number ?
78-
Repeat<Type, Holder['length']> | Repeat<Type, Rest>
79-
: never
80-
: never
81-
}[
82-
Holder['length'] extends Count ? // It is possible for Count to be a union
83-
Count extends Holder['length'] ? // Make sure that Count is not a union
84-
'fit'
85-
: 'union'
86-
: 'unfit'
87-
]
56+
number extends Count ? Type[] :
57+
Holder['length'] extends Count ? // It is possible for Count to be a union
58+
Count extends Holder['length'] ? // Make sure that Count is not a union
59+
Holder
60+
// Count is a union
61+
: Count extends Holder['length'] | infer Rest ?
62+
Rest extends number ?
63+
Repeat<Type, Holder['length']> | Repeat<Type, Rest>
64+
: never
65+
: never
66+
// Count is not Holder['length']
67+
: Repeat<Type, Count, Prepend<Holder, Type>>
8868

8969
export type ConcatMultiple<TupleSet extends any[][]> = {
9070
empty: []
@@ -103,100 +83,67 @@ export type ConcatMultiple<TupleSet extends any[][]> = {
10383
TupleSet extends [] ? 'empty' : IsFinite<TupleSet, 'nonEmpty', 'infinite'>
10484
]
10585

106-
export type Drop<
107-
Tuple extends any[],
108-
Quantity extends number,
109-
Count extends any[] = []
110-
> = {
111-
matched: Tuple
112-
unmatched: ((...args: Tuple) => any) extends ((_: any, ..._1: infer Rest) => any)
86+
export type Drop<Tuple extends any[], Quantity extends number, Count extends any[] = []> =
87+
Tuple extends [] ? Tuple :
88+
Quantity extends Count['length'] ? Tuple :
89+
((...args: Tuple) => any) extends ((_: any, ..._1: infer Rest) => any)
11390
? Drop<Rest, Quantity, Prepend<Count, Count['length']>>
114-
: never
115-
}[
116-
Tuple extends [] ? 'matched' :
117-
Quantity extends Count['length'] ? 'matched' :
118-
'unmatched'
119-
]
91+
: never
12092

12193
export type SliceStartQuantity<
12294
Tuple extends any[],
12395
Start extends number,
12496
Quantity extends number,
12597
Holder extends any[] = [],
12698
Count extends any[] = []
127-
> = {
128-
before: SliceStartQuantity<
99+
> =
100+
Tuple extends [] ? Reverse<Holder> :
101+
Quantity extends Holder['length'] ? Reverse<Holder> :
102+
Start extends Count['length'] ?
103+
Tuple extends [infer First, ...infer Rest]
104+
? SliceStartQuantity<Rest, Start, Quantity, Prepend<Holder, First>, Count>
105+
: never
106+
: SliceStartQuantity<
129107
Tail<Tuple>,
130108
Start,
131109
Quantity,
132110
Holder,
133111
Prepend<Count, Count['length']>
134112
>
135-
start: ((...args: Tuple) => any) extends ((_: infer First, ..._1: infer Rest) => any)
136-
? SliceStartQuantity<
137-
Rest,
138-
Start,
139-
Quantity,
140-
Prepend<Holder, First>,
141-
Count
142-
>
143-
: never
144-
end: Reverse<Holder>
145-
}[
146-
Tuple extends [] ? 'end' :
147-
Quantity extends Holder['length'] ? 'end' :
148-
Start extends Count['length'] ? 'start' :
149-
'before'
150-
]
151113

152114
export type FillTuple<Tuple extends any[], Replacement, Holder extends any[] = []> = {
153115
empty: Holder
154-
nonEmpty: ((...a: Tuple) => any) extends ((a: infer First, ...b: infer Rest) => any)
116+
nonEmpty: Tuple extends [any, ...infer Rest]
155117
? FillTuple<Rest, Replacement, Prepend<Holder, Replacement>>
156118
: never
157119
infinite: Replacement[]
158120
}[
159121
Tuple extends [] ? 'empty' : IsFinite<Tuple, 'nonEmpty', 'infinite'>
160122
]
161123

162-
export type CompareLength<Left extends any[], Right extends any[]> = {
163-
fitBoth: 'equal'
164-
fitLeft: 'shorterLeft'
165-
fitRight: 'shorterRight'
166-
unfit: ((..._: Left) => any) extends ((_: any, ..._1: infer LeftRest) => any) ?
167-
((..._: Right) => any) extends ((_: any, ..._1: infer RightRest) => any) ?
168-
CompareLength<LeftRest, RightRest>
169-
: never
170-
: never
171-
}[
172-
Left['length'] extends Right['length'] ? 'fitBoth' :
173-
Left extends [] ? 'fitLeft' :
174-
Right extends [] ? 'fitRight' :
175-
'unfit'
176-
]
124+
export type CompareLength<Left extends any[], Right extends any[]> =
125+
Left['length'] extends Right['length'] ? 'equal' :
126+
Left extends [] ? 'shorterLeft' :
127+
Right extends [] ? 'shorterRight' :
128+
CompareLength<Tail<Left>, Tail<Right>>
177129

178130
export type SortTwoTuple<Left extends any[], Right extends any[], WhenEqual = [Left, Right]> = {
179131
equal: WhenEqual
180132
shorterLeft: [Left, Right]
181133
shorterRight: [Right, Left]
182134
}[CompareLength<Left, Right>]
183135

184-
export type ShortestTuple<TupleSet extends any[][], Shortest = any[]> = {
185-
empty: Shortest
186-
nonEmpty: ((..._: TupleSet) => any) extends ((_: infer Head, ..._1: infer Tail) => any) ?
136+
export type ShortestTuple<TupleSet extends any[][], Shortest extends any[] = any[]> =
137+
TupleSet extends [] ? Shortest :
138+
((..._: TupleSet) => any) extends ((_: infer Head, ..._1: infer Tail) => any) ?
187139
Tail extends any[] ?
188-
Shortest extends any[] ?
189140
Head extends any[] ?
190141
Tail extends Head[]
191142
? SortTwoTuple<Shortest, Head>[0]
192143
: ShortestTuple<Tail, SortTwoTuple<Shortest, Head>[0]>
193144
: never
194145
: never
195-
: never
196-
: never
197-
}[
198-
TupleSet extends [] ? 'empty' : 'nonEmpty'
199-
]
146+
: never
200147

201148
export type LongestTuple<TupleSet extends any[][], Longest = []> = {
202149
empty: Longest

0 commit comments

Comments
 (0)