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
2819export 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
4530export 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
5237export 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
6954export 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
8969export 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
12193export 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
152114export 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
178130export 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
201148export type LongestTuple < TupleSet extends any [ ] [ ] , Longest = [ ] > = {
202149 empty : Longest
0 commit comments