Skip to content

[Bug]tsc does not finish #26314

Closed
Closed
@kgtkr

Description

@kgtkr

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScript

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions