Skip to content

Commit e5acd48

Browse files
some work on flipped, doesn't work and will give up due to TS authors discouraging this https://github.com/Microsoft/TypeScript/pull/24897\#issuecomment-401418254
1 parent f05cbf2 commit e5acd48

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/FunctionX.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2766
type 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

79122
const f/*: FunctionX0<number>*/ = FunctionX.of(()=>5);

0 commit comments

Comments
 (0)