Closed
Description
TypeScript Version: 3.0.1/3.1.0-dev.20180808
Search Terms:
Code
type Head<T> = T extends [infer P, ...any[]] ? P : never;
type Tail<L extends any[]> = ((...x: L) => void) extends ((h: any, ...rest: infer T) => void) ? T : never
type Last<T extends any[]> = {
0: never,
1: Head<T>,
2: Last<Tail<T>>,
}[T extends [] ? 0 : T extends [any] ? 1 : 2];
type Reverse<L extends any[], X extends any[]=[]> = {
1: X, 0: Reverse<Tail<L>, Cons<Head<L>, X>>
}[L extends [] ? 1 : 0]
type Fn<R extends any[]> = (...args: R) => void
type Fn1<H, T extends any[]> = (h: H, ...args: T) => void
type Cons<H, T extends any[]> = Fn1<H, T> extends Fn<infer R> ? R : []
type Zip<A extends any[], B extends any[], R extends any[]=[]> = {
0: Reverse<R>,
1: Zip<Tail<A>, Tail<B>, Cons<[Head<A>, Head<B>], R>>
}[A extends [] ? 0 : B extends [] ? 0 : 1];
type ShiftZip<T extends any[]> = Zip<T, Tail<T>>;
type Tuple2Fn<T> = T extends [infer A, infer B] ? (x: A) => B : never;
type _Pipe<T extends any[], R extends any[]=[]> = {
0: Reverse<R>,
1: _Pipe<Tail<T>, Cons<Tuple2Fn<Head<T>>, R>>
}[T extends [] ? 0 : 1];
type Pipe<T extends any[]>=_Pipe<ShiftZip<T>>;
declare function pipe<T extends any[]>(...f: Pipe<T>): (x: Head<T>) => Last<T>;
Expected behavior:
tsc finish
Actual behavior:
tsc does not finish
Playground Link:
Related Issues:
#24897