@@ -24,6 +24,45 @@ type TTail<T extends any[]> =
2424 : T extends [ ] ? [ ]
2525 : never ;
2626
27+ type TLast < T extends any [ ] > = T extends [ ] ? never :
28+ T extends [ infer T1 ] ? T1 : { 0 :TTail < T > , 1 :never } [ T extends [ infer T1 , infer S ] ? 0 : 1 ] ;
29+
30+ // type TInit<T extends any[]> = T extends []
31+ // ? []
32+ // : T extends [any]
33+ // ? []
34+ // : (((...args: T) => void) extends ((first: infer T1, ...rest: infer T2) => void) ?
35+ // (((a:T1,...rest:TInit<T2>)=>void) extends ((...all: infer AP)=>void) ? AP : never) : never)
36+
37+ type Head < Tuple extends any [ ] > = Tuple extends [ infer H , ...any [ ] ] ? H : never ;
38+ type Tail < Tuple extends any [ ] > = ( ( ...t : Tuple ) => void ) extends ( ( h : any , ...rest : infer R ) => void ) ? R : never ;
39+ type Unshift < Tuple extends any [ ] , Element > = ( ( h : Element , ...t : Tuple ) => void ) extends ( ...t : infer R ) => void ? R : never ;
40+
41+ // https://github.com/Microsoft/TypeScript/pull/24897#issuecomment-401401470
42+ // he has a simpler head & tail than me!
43+ type Reverse < Tuple extends any [ ] > = Reverse_ < Tuple , [ ] > ;
44+ type Reverse_ < Tuple extends any [ ] , Result extends any [ ] > = {
45+ 1 : Result ,
46+ 0 : Reverse_ < Tail < Tuple > , Unshift < Result , Head < Tuple > > >
47+ } [ Tuple extends [ ] ? 1 : 0 ] ;
48+
49+ // type TInit<T extends any[]> = {
50+ // 0: ((...args: T) => void) extends ((first: infer T1, ...rest: infer T2) => void)
51+ // ? (((a:T1,...rest:TInit<T2>)=>void) extends ((...all: infer AP)=>void) ? AP : never)
52+ // : never,
53+ // 1: []
54+ // }[T extends []|[any] ? 1 : 0]
55+
56+ // type TReverse<T extends any[]> = {
57+ // 0: [],
58+ // 1: ((a:TLast<T>, ...args: TReverse<TInit<T>>)=>void) extends ((...all: infer AP) => void)
59+ // ? AP : never
60+ // }[T extends [] ? 0 : 1];
61+ // type TReverse<T extends any[]> = T extends []
62+ // ? []
63+ // : ((a:TLast<T>, ...args: TReverse<TInit<T>>)=>void) extends ((...all: infer AP) => void)
64+ // ? AP : never;
65+
2766type Apply1ReturnType < P , R > = P extends [ infer T1 , infer T2 , ...any [ ] ] ?
2867 ( ( ( ...args : P ) => void ) extends ( ( first : any , ...rest : infer S1 ) => void ) ? FunctionX < T1 , S1 , R > : never )
2968 : FunctionX0 < R > ;
@@ -74,6 +113,10 @@ export class FunctionX<T, P extends any[], R> {
74113 // FunctionX<[T,...P],[],R> {
75114 return < any > null ;
76115 }
116+
117+ public flipped ( ) : FunctionX < Tail < P > , Tail < Reverse < P > > , R > {
118+ return < any > null ;
119+ }
77120}
78121
79122const f /*: FunctionX0<number>*/ = FunctionX . of ( ( ) => 5 ) ;
0 commit comments