(transform: (t: T) => U) =>
+>map : Symbol(map, Decl(genericFunctionInference1.ts, 98, 5))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 98, 13))
+>U : Symbol(U, Decl(genericFunctionInference1.ts, 98, 15))
+>transform : Symbol(transform, Decl(genericFunctionInference1.ts, 98, 19))
+>t : Symbol(t, Decl(genericFunctionInference1.ts, 98, 31))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 98, 13))
+>U : Symbol(U, Decl(genericFunctionInference1.ts, 98, 15))
+
+ (arr: T[]) => arr.map(transform)
+>arr : Symbol(arr, Decl(genericFunctionInference1.ts, 99, 5))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 98, 13))
+>arr.map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
+>arr : Symbol(arr, Decl(genericFunctionInference1.ts, 99, 5))
+>map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --))
+>transform : Symbol(transform, Decl(genericFunctionInference1.ts, 98, 19))
+
+const identityStr = (t: string) => t;
+>identityStr : Symbol(identityStr, Decl(genericFunctionInference1.ts, 101, 5))
+>t : Symbol(t, Decl(genericFunctionInference1.ts, 101, 21))
+>t : Symbol(t, Decl(genericFunctionInference1.ts, 101, 21))
+
+const arr: string[] = map(identityStr)(['a']);
+>arr : Symbol(arr, Decl(genericFunctionInference1.ts, 103, 5))
+>map : Symbol(map, Decl(genericFunctionInference1.ts, 98, 5))
+>identityStr : Symbol(identityStr, Decl(genericFunctionInference1.ts, 101, 5))
+
+const arr1: string[] = map(identity)(['a']);
+>arr1 : Symbol(arr1, Decl(genericFunctionInference1.ts, 104, 5))
+>map : Symbol(map, Decl(genericFunctionInference1.ts, 98, 5))
+>identity : Symbol(identity, Decl(genericFunctionInference1.ts, 154, 13))
+
+// #9949
+
+function of2(one: a, two: b): [a, b] {
+>of2 : Symbol(of2, Decl(genericFunctionInference1.ts, 104, 44))
+>a : Symbol(a, Decl(genericFunctionInference1.ts, 108, 13))
+>b : Symbol(b, Decl(genericFunctionInference1.ts, 108, 15))
+>one : Symbol(one, Decl(genericFunctionInference1.ts, 108, 19))
+>a : Symbol(a, Decl(genericFunctionInference1.ts, 108, 13))
+>two : Symbol(two, Decl(genericFunctionInference1.ts, 108, 26))
+>b : Symbol(b, Decl(genericFunctionInference1.ts, 108, 15))
+>a : Symbol(a, Decl(genericFunctionInference1.ts, 108, 13))
+>b : Symbol(b, Decl(genericFunctionInference1.ts, 108, 15))
+
+ return [one, two];
+>one : Symbol(one, Decl(genericFunctionInference1.ts, 108, 19))
+>two : Symbol(two, Decl(genericFunctionInference1.ts, 108, 26))
+}
+
+const flipped = flip(of2);
+>flipped : Symbol(flipped, Decl(genericFunctionInference1.ts, 112, 5))
+>flip : Symbol(flip, Decl(genericFunctionInference1.ts, 82, 20))
+>of2 : Symbol(of2, Decl(genericFunctionInference1.ts, 104, 44))
+
+// #29904.1
+
+type Component = (props: P) => {};
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 116, 15))
+>props : Symbol(props, Decl(genericFunctionInference1.ts, 116, 21))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 116, 15))
+
+declare const myHoc1:
(C: Component
) => Component
;
+>myHoc1 : Symbol(myHoc1, Decl(genericFunctionInference1.ts, 118, 13))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 118, 23))
+>C : Symbol(C, Decl(genericFunctionInference1.ts, 118, 26))
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 118, 23))
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 118, 23))
+
+declare const myHoc2:
(C: Component
) => Component
;
+>myHoc2 : Symbol(myHoc2, Decl(genericFunctionInference1.ts, 119, 13))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 119, 23))
+>C : Symbol(C, Decl(genericFunctionInference1.ts, 119, 26))
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 119, 23))
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>P : Symbol(P, Decl(genericFunctionInference1.ts, 119, 23))
+
+declare const MyComponent1: Component<{ foo: 1 }>;
+>MyComponent1 : Symbol(MyComponent1, Decl(genericFunctionInference1.ts, 121, 13))
+>Component : Symbol(Component, Decl(genericFunctionInference1.ts, 112, 26))
+>foo : Symbol(foo, Decl(genericFunctionInference1.ts, 121, 39))
+
+const enhance = pipe(
+>enhance : Symbol(enhance, Decl(genericFunctionInference1.ts, 123, 5))
+>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
+
+ myHoc1,
+>myHoc1 : Symbol(myHoc1, Decl(genericFunctionInference1.ts, 118, 13))
+
+ myHoc2,
+>myHoc2 : Symbol(myHoc2, Decl(genericFunctionInference1.ts, 119, 13))
+
+);
+
+const MyComponent2 = enhance(MyComponent1);
+>MyComponent2 : Symbol(MyComponent2, Decl(genericFunctionInference1.ts, 128, 5))
+>enhance : Symbol(enhance, Decl(genericFunctionInference1.ts, 123, 5))
+>MyComponent1 : Symbol(MyComponent1, Decl(genericFunctionInference1.ts, 121, 13))
// #29904.2
const fn20 = pipe((_a?: {}) => 1);
->fn20 : Symbol(fn20, Decl(genericFunctionInference1.ts, 27, 5))
+>fn20 : Symbol(fn20, Decl(genericFunctionInference1.ts, 132, 5))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
->_a : Symbol(_a, Decl(genericFunctionInference1.ts, 27, 19))
+>_a : Symbol(_a, Decl(genericFunctionInference1.ts, 132, 19))
// #29904.3
type Fn = (n: number) => number;
->Fn : Symbol(Fn, Decl(genericFunctionInference1.ts, 27, 34))
->n : Symbol(n, Decl(genericFunctionInference1.ts, 31, 11))
+>Fn : Symbol(Fn, Decl(genericFunctionInference1.ts, 132, 34))
+>n : Symbol(n, Decl(genericFunctionInference1.ts, 136, 11))
const fn30: Fn = pipe(
->fn30 : Symbol(fn30, Decl(genericFunctionInference1.ts, 32, 5))
->Fn : Symbol(Fn, Decl(genericFunctionInference1.ts, 27, 34))
+>fn30 : Symbol(fn30, Decl(genericFunctionInference1.ts, 137, 5))
+>Fn : Symbol(Fn, Decl(genericFunctionInference1.ts, 132, 34))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
x => x + 1,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 32, 22))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 32, 22))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 137, 22))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 137, 22))
x => x * 2,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 33, 15))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 33, 15))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 138, 15))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 138, 15))
);
const promise = Promise.resolve(1);
->promise : Symbol(promise, Decl(genericFunctionInference1.ts, 37, 5))
+>promise : Symbol(promise, Decl(genericFunctionInference1.ts, 142, 5))
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
promise.then(
>promise.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --))
->promise : Symbol(promise, Decl(genericFunctionInference1.ts, 37, 5))
+>promise : Symbol(promise, Decl(genericFunctionInference1.ts, 142, 5))
>then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --))
pipe(
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
x => x + 1,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 39, 9))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 39, 9))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 144, 9))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 144, 9))
x => x * 2,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 40, 19))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 40, 19))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 145, 19))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 145, 19))
),
);
@@ -288,94 +757,94 @@ promise.then(
// #29904.4
declare const getString: () => string;
->getString : Symbol(getString, Decl(genericFunctionInference1.ts, 47, 13))
+>getString : Symbol(getString, Decl(genericFunctionInference1.ts, 152, 13))
declare const orUndefined: (name: string) => string | undefined;
->orUndefined : Symbol(orUndefined, Decl(genericFunctionInference1.ts, 48, 13))
->name : Symbol(name, Decl(genericFunctionInference1.ts, 48, 28))
+>orUndefined : Symbol(orUndefined, Decl(genericFunctionInference1.ts, 153, 13))
+>name : Symbol(name, Decl(genericFunctionInference1.ts, 153, 28))
declare const identity: (value: T) => T;
->identity : Symbol(identity, Decl(genericFunctionInference1.ts, 49, 13))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 49, 25))
->value : Symbol(value, Decl(genericFunctionInference1.ts, 49, 28))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 49, 25))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 49, 25))
+>identity : Symbol(identity, Decl(genericFunctionInference1.ts, 154, 13))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 154, 25))
+>value : Symbol(value, Decl(genericFunctionInference1.ts, 154, 28))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 154, 25))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 154, 25))
const fn40 = pipe(
->fn40 : Symbol(fn40, Decl(genericFunctionInference1.ts, 51, 5))
+>fn40 : Symbol(fn40, Decl(genericFunctionInference1.ts, 156, 5))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
getString,
->getString : Symbol(getString, Decl(genericFunctionInference1.ts, 47, 13))
+>getString : Symbol(getString, Decl(genericFunctionInference1.ts, 152, 13))
string => orUndefined(string),
->string : Symbol(string, Decl(genericFunctionInference1.ts, 52, 14))
->orUndefined : Symbol(orUndefined, Decl(genericFunctionInference1.ts, 48, 13))
->string : Symbol(string, Decl(genericFunctionInference1.ts, 52, 14))
+>string : Symbol(string, Decl(genericFunctionInference1.ts, 157, 14))
+>orUndefined : Symbol(orUndefined, Decl(genericFunctionInference1.ts, 153, 13))
+>string : Symbol(string, Decl(genericFunctionInference1.ts, 157, 14))
identity,
->identity : Symbol(identity, Decl(genericFunctionInference1.ts, 49, 13))
+>identity : Symbol(identity, Decl(genericFunctionInference1.ts, 154, 13))
);
// #29904.6
declare const getArray: () => string[];
->getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 59, 13))
+>getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 164, 13))
declare const first: (ts: T[]) => T;
->first : Symbol(first, Decl(genericFunctionInference1.ts, 60, 13))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 60, 22))
->ts : Symbol(ts, Decl(genericFunctionInference1.ts, 60, 25))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 60, 22))
->T : Symbol(T, Decl(genericFunctionInference1.ts, 60, 22))
+>first : Symbol(first, Decl(genericFunctionInference1.ts, 165, 13))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 165, 22))
+>ts : Symbol(ts, Decl(genericFunctionInference1.ts, 165, 25))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 165, 22))
+>T : Symbol(T, Decl(genericFunctionInference1.ts, 165, 22))
const fn60 = pipe(
->fn60 : Symbol(fn60, Decl(genericFunctionInference1.ts, 62, 5))
+>fn60 : Symbol(fn60, Decl(genericFunctionInference1.ts, 167, 5))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
getArray,
->getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 59, 13))
+>getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 164, 13))
x => x,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 63, 13))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 63, 13))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 168, 13))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 168, 13))
first,
->first : Symbol(first, Decl(genericFunctionInference1.ts, 60, 13))
+>first : Symbol(first, Decl(genericFunctionInference1.ts, 165, 13))
);
const fn61 = pipe(
->fn61 : Symbol(fn61, Decl(genericFunctionInference1.ts, 68, 5))
+>fn61 : Symbol(fn61, Decl(genericFunctionInference1.ts, 173, 5))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
getArray,
->getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 59, 13))
+>getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 164, 13))
identity,
->identity : Symbol(identity, Decl(genericFunctionInference1.ts, 49, 13))
+>identity : Symbol(identity, Decl(genericFunctionInference1.ts, 154, 13))
first,
->first : Symbol(first, Decl(genericFunctionInference1.ts, 60, 13))
+>first : Symbol(first, Decl(genericFunctionInference1.ts, 165, 13))
);
const fn62 = pipe(
->fn62 : Symbol(fn62, Decl(genericFunctionInference1.ts, 74, 5))
+>fn62 : Symbol(fn62, Decl(genericFunctionInference1.ts, 179, 5))
>pipe : Symbol(pipe, Decl(genericFunctionInference1.ts, 0, 0), Decl(genericFunctionInference1.ts, 0, 84), Decl(genericFunctionInference1.ts, 1, 104))
getArray,
->getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 59, 13))
+>getArray : Symbol(getArray, Decl(genericFunctionInference1.ts, 164, 13))
x => x,
->x : Symbol(x, Decl(genericFunctionInference1.ts, 75, 13))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 75, 13))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 180, 13))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 180, 13))
x => first(x),
->x : Symbol(x, Decl(genericFunctionInference1.ts, 76, 11))
->first : Symbol(first, Decl(genericFunctionInference1.ts, 60, 13))
->x : Symbol(x, Decl(genericFunctionInference1.ts, 76, 11))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 181, 11))
+>first : Symbol(first, Decl(genericFunctionInference1.ts, 165, 13))
+>x : Symbol(x, Decl(genericFunctionInference1.ts, 181, 11))
);
diff --git a/tests/baselines/reference/genericFunctionInference1.types b/tests/baselines/reference/genericFunctionInference1.types
index cf85c1b5afb..e68b0ed6da0 100644
--- a/tests/baselines/reference/genericFunctionInference1.types
+++ b/tests/baselines/reference/genericFunctionInference1.types
@@ -32,6 +32,11 @@ declare function box(x: V): { value: V };
>x : V
>value : V
+declare function foo(x: T): T;
+>foo : (x: T) => T
+>value : T
+>x : T
+
const f00 = pipe(list);
>f00 : (a: T) => T[]
>pipe(list) : (a: T) => T[]
@@ -45,8 +50,15 @@ const f01 = pipe(list, box);
>list : (a: T) => T[]
>box : (x: V) => { value: V; }
-const f02 = pipe(x => list(x), box);
->f02 : (x: any) => { value: any[]; }
+const f02 = pipe(box, list);
+>f02 : (x: V) => { value: V; }[]
+>pipe(box, list) : (x: V) => { value: V; }[]
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>box : (x: V) => { value: V; }
+>list : (a: T) => T[]
+
+const f03 = pipe(x => list(x), box);
+>f03 : (x: any) => { value: any[]; }
>pipe(x => list(x), box) : (x: any) => { value: any[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>x => list(x) : (x: any) => any[]
@@ -56,8 +68,8 @@ const f02 = pipe(x => list(x), box);
>x : any
>box : (x: V) => { value: V; }
-const f03 = pipe(list, x => box(x));
->f03 : (a: T) => { value: T[]; }
+const f04 = pipe(list, x => box(x));
+>f04 : (a: T) => { value: T[]; }
>pipe(list, x => box(x)) : (a: T) => { value: T[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>list : (a: T) => T[]
@@ -67,8 +79,8 @@ const f03 = pipe(list, x => box(x));
>box : (x: V) => { value: V; }
>x : T[]
-const f04 = pipe(x => list(x), x => box(x))
->f04 : (x: any) => { value: any[]; }
+const f05 = pipe(x => list(x), x => box(x))
+>f05 : (x: any) => { value: any[]; }
>pipe(x => list(x), x => box(x)) : (x: any) => { value: any[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>x => list(x) : (x: any) => any[]
@@ -82,8 +94,8 @@ const f04 = pipe(x => list(x), x => box(x))
>box : (x: V) => { value: V; }
>x : any[]
-const f05 = pipe(list, pipe(box));
->f05 : (a: T) => { value: T[]; }
+const f06 = pipe(list, pipe(box));
+>f06 : (a: T) => { value: T[]; }
>pipe(list, pipe(box)) : (a: T) => { value: T[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>list : (a: T) => T[]
@@ -91,8 +103,8 @@ const f05 = pipe(list, pipe(box));
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>box : (x: V) => { value: V; }
-const f06 = pipe(x => list(x), pipe(box));
->f06 : (x: any) => { value: any[]; }
+const f07 = pipe(x => list(x), pipe(box));
+>f07 : (x: any) => { value: any[]; }
>pipe(x => list(x), pipe(box)) : (x: any) => { value: any[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>x => list(x) : (x: any) => any[]
@@ -104,8 +116,8 @@ const f06 = pipe(x => list(x), pipe(box));
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>box : (x: V) => { value: V; }
-const f07 = pipe(x => list(x), pipe(x => box(x)));
->f07 : (x: any) => { value: any[]; }
+const f08 = pipe(x => list(x), pipe(x => box(x)));
+>f08 : (x: any) => { value: any[]; }
>pipe(x => list(x), pipe(x => box(x))) : (x: any) => { value: any[]; }
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>x => list(x) : (x: any) => any[]
@@ -121,15 +133,39 @@ const f07 = pipe(x => list(x), pipe(x => box(x)));
>box : (x: V) => { value: V; }
>x : any[]
-const f10: (x: T) => T[] = pipe(list);
->f10 : (x: T) => T[]
+const f09 = pipe(list, x => x.length);
+>f09 : (a: T) => number
+>pipe(list, x => x.length) : (a: T) => number
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>list : (a: T) => T[]
+>x => x.length : (x: T[]) => number
+>x : T[]
+>x.length : number
+>x : T[]
+>length : number
+
+const f10 = pipe(foo);
+>f10 : (x: T) => T
+>pipe(foo) : (x: T) => T
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>foo : (x: T) => T
+
+const f11 = pipe(foo, foo);
+>f11 : (x: T) => T
+>pipe(foo, foo) : (x: T) => T
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>foo : (x: T) => T
+>foo : (x: T) => T
+
+const g00: (x: T) => T[] = pipe(list);
+>g00 : (x: T) => T[]
>x : T
>pipe(list) : (a: T) => T[]
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>list : (a: T) => T[]
-const f11: (x: T) => { value: T[] } = pipe(list, box);
->f11 : (x: T) => { value: T[]; }
+const g01: (x: T) => { value: T[] } = pipe(list, box);
+>g01 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(list, box) : (a: T) => { value: T[]; }
@@ -137,8 +173,17 @@ const f11: (x: T) => { value: T[] } = pipe(list, box);
>list : (a: T) => T[]
>box : (x: V) => { value: V; }
-const f12: (x: T) => { value: T[] } = pipe(x => list(x), box);
->f12 : (x: T) => { value: T[]; }
+const g02: (x: T) => { value: T }[] = pipe(box, list);
+>g02 : (x: T) => { value: T; }[]
+>x : T
+>value : T
+>pipe(box, list) : (x: T) => { value: T; }[]
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>box : (x: V) => { value: V; }
+>list : (a: T) => T[]
+
+const g03: (x: T) => { value: T[] } = pipe(x => list(x), box);
+>g03 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(x => list(x), box) : (x: T) => { value: T[]; }
@@ -150,8 +195,8 @@ const f12: (x: T) => { value: T[] } = pipe(x => list(x), box);
>x : T
>box : (x: V) => { value: V; }
-const f13: (x: T) => { value: T[] } = pipe(list, x => box(x));
->f13 : (x: T) => { value: T[]; }
+const g04: (x: T) => { value: T[] } = pipe(list, x => box(x));
+>g04 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(list, x => box(x)) : (a: T) => { value: T[]; }
@@ -163,8 +208,8 @@ const f13: (x: T) => { value: T[] } = pipe(list, x => box(x));
>box : (x: V) => { value: V; }
>x : T[]
-const f14: (x: T) => { value: T[] } = pipe(x => list(x), x => box(x))
->f14 : (x: T) => { value: T[]; }
+const g05: (x: T) => { value: T[] } = pipe(x => list(x), x => box(x))
+>g05 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(x => list(x), x => box(x)) : (x: T) => { value: T[]; }
@@ -180,8 +225,8 @@ const f14: (x: T) => { value: T[] } = pipe(x => list(x), x => box(x))
>box : (x: V) => { value: V; }
>x : T[]
-const f15: (x: T) => { value: T[] } = pipe(list, pipe(box));
->f15 : (x: T) => { value: T[]; }
+const g06: (x: T) => { value: T[] } = pipe(list, pipe(box));
+>g06 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(list, pipe(box)) : (a: T) => { value: T[]; }
@@ -191,8 +236,8 @@ const f15: (x: T) => { value: T[] } = pipe(list, pipe(box));
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>box : (x: V) => { value: V; }
-const f16: (x: T) => { value: T[] } = pipe(x => list(x), pipe(box));
->f16 : (x: T) => { value: T[]; }
+const g07: (x: T) => { value: T[] } = pipe(x => list(x), pipe(box));
+>g07 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(x => list(x), pipe(box)) : (x: T) => { value: T[]; }
@@ -206,8 +251,8 @@ const f16: (x: T) => { value: T[] } = pipe(x => list(x), pipe(box));
>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
>box : (x: V) => { value: V; }
-const f17: (x: T) => { value: T[] } = pipe(x => list(x), pipe(x => box(x)));
->f17 : (x: T) => { value: T[]; }
+const g08: (x: T) => { value: T[] } = pipe(x => list(x), pipe(x => box(x)));
+>g08 : (x: T) => { value: T[]; }
>x : T
>value : T[]
>pipe(x => list(x), pipe(x => box(x))) : (x: T) => { value: T[]; }
@@ -225,6 +270,365 @@ const f17: (x: T) => { value: T[] } = pipe(x => list(x), pipe(x => box(x)));
>box : (x: V) => { value: V; }
>x : T[]
+const g09: (x: T) => number = pipe(list, x => x.length);
+>g09 : (x: T) => number
+>x : T
+>pipe(list, x => x.length) : (a: T) => number
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>list : (a: T) => T[]
+>x => x.length : (x: T[]) => number
+>x : T[]
+>x.length : number
+>x : T[]
+>length : number
+
+const g10: (x: T) => T = pipe(foo);
+>g10 : (x: T) => T
+>value : T
+>x : T
+>pipe(foo) : (x: T) => T
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>foo : (x: T) => T
+
+const g12: (x: T) => T = pipe(foo, foo);
+>g12 : (x: T) => T
+>value : T
+>x : T
+>pipe(foo, foo) : (x: T) => T
+>pipe : { (ab: (...args: A) => B): (...args: A) => B; (ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; (ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
+>foo : (x: T) => T
+>foo : (x: T) => T
+
+declare function pipe2(ab: (a: A) => B, cd: (c: C) => D): (a: [A, C]) => [B, D];
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>ab : (a: A) => B
+>a : A
+>cd : (c: C) => D
+>c : C
+>a : [A, C]
+
+const f20 = pipe2(list, box);
+>f20 : (a: [T, V]) => [T[], { value: V; }]
+>pipe2(list, box) : (a: [T, V]) => [T[], { value: V; }]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>list : (a: T) => T[]
+>box : (x: V) => { value: V; }
+
+const f21 = pipe2(box, list);
+>f21 : (a: [V, T]) => [{ value: V; }, T[]]
+>pipe2(box, list) : (a: [V, T]) => [{ value: V; }, T[]]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>box : (x: V) => { value: V; }
+>list : (a: T) => T[]
+
+const f22 = pipe2(list, list);
+>f22 : (a: [T, T1]) => [T[], T1[]]
+>pipe2(list, list) : (a: [T, T1]) => [T[], T1[]]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>list : (a: T) => T[]
+>list : (a: T) => T[]
+
+const f23 = pipe2(box, box);
+>f23 : (a: [V, V1]) => [{ value: V; }, { value: V1; }]
+>pipe2(box, box) : (a: [V, V1]) => [{ value: V; }, { value: V1; }]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>box : (x: V) => { value: V; }
+>box : (x: V) => { value: V; }
+
+const f24 = pipe2(f20, f20);
+>f24 : (a: [[T, V], [T1, V1]]) => [[T[], { value: V; }], [T1[], { value: V1; }]]
+>pipe2(f20, f20) : (a: [[T, V], [T1, V1]]) => [[T[], { value: V; }], [T1[], { value: V1; }]]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>f20 : (a: [T, V]) => [T[], { value: V; }]
+>f20 : (a: [T, V]) => [T[], { value: V; }]
+
+const f25 = pipe2(foo, foo);
+>f25 : (a: [T, T1]) => [T, T1]
+>pipe2(foo, foo) : (a: [T, T1]) => [T, T1]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>foo : (x: T) => T
+>foo : (x: T) => T
+
+const f26 = pipe2(f25, f25);
+>f26 : (a: [[T, T1], [T2, T3]]) => [[T, T1], [T2, T3]]
+>pipe2(f25, f25) : (a: [[T, T1], [T2, T3]]) => [[T, T1], [T2, T3]]
+>pipe2 : (ab: (a: A) => B, cd: (c: C) => D) => (a: [A, C]) => [B, D]
+>f25 : (a: [T, T1]) => [T, T1]
+>f25 : (a: [T, T1]) => [T, T1]
+
+declare function pipe3(ab: (a: A) => B, ac: (a: A) => C): (a: A) => [B, C];
+>pipe3 : (ab: (a: A) => B, ac: (a: A) => C) => (a: A) => [B, C]
+>ab : (a: A) => B
+>a : A
+>ac : (a: A) => C
+>a : A
+>a : A
+
+const f30 = pipe3(list, box);
+>f30 : (a: T) => [T[], { value: T; }]
+>pipe3(list, box) : (a: T) => [T[], { value: T; }]
+>pipe3 : (ab: (a: A) => B, ac: (a: A) => C) => (a: A) => [B, C]
+>list : (a: T) => T[]
+>box : (x: V) => { value: V; }
+
+const f31 = pipe3(box, list);
+>f31 : (a: V) => [{ value: V; }, V[]]
+>pipe3(box, list) : (a: V) => [{ value: V; }, V[]]
+>pipe3 : (ab: (a: A) => B, ac: (a: A) => C) => (a: A) => [B, C]
+>box : (x: V) => { value: V; }
+>list : (a: T) => T[]
+
+const f32 = pipe3(list, list);
+>f32 : (a: T) => [T[], T[]]
+>pipe3(list, list) : (a: T) => [T[], T[]]
+>pipe3 : (ab: (a: A) => B, ac: (a: A) => C) => (a: A) => [B, C]
+>list : (a: T) => T[]
+>list : (a: T) => T[]
+
+declare function pipe4(funcs: [(a: A) => B, (b: B) => C]): (a: A) => C;
+>pipe4 : (funcs: [(a: A) => B, (b: B) => C]) => (a: A) => C
+>funcs : [(a: A) => B, (b: B) => C]
+>a : A
+>b : B
+>a : A
+
+const f40 = pipe4([list, box]);
+>f40 : (a: T) => { value: T[]; }
+>pipe4([list, box]) : (a: T) => { value: T[]; }
+>pipe4 :