Skip to content

Commit d66a309

Browse files
authored
Add test for issue fixed by #58546 (#58635)
1 parent 2b4e7e3 commit d66a309

4 files changed

+1452
-0
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
//// [tests/cases/compiler/declarationEmitHigherOrderRetainedGenerics.ts] ////
2+
3+
//// [declarationEmitHigherOrderRetainedGenerics.ts]
4+
export interface TypeLambda {
5+
readonly In: unknown
6+
readonly Out2: unknown
7+
readonly Out1: unknown
8+
readonly Target: unknown
9+
}
10+
export namespace Types {
11+
export type Invariant<A> = (_: A) => A
12+
export type Covariant<A> = (_: never) => A
13+
export type Contravariant<A> = (_: A) => void
14+
}
15+
16+
export declare const URI: unique symbol;
17+
export interface TypeClass<F extends TypeLambda> {
18+
readonly [URI]?: F
19+
}
20+
21+
export interface Invariant<F extends TypeLambda> extends TypeClass<F> {
22+
readonly imap: {
23+
<A, B>(
24+
to: (a: A) => B,
25+
from: (b: B) => A
26+
): <R, O, E>(self: Kind<F, R, O, E, A>) => Kind<F, R, O, E, B>
27+
<R, O, E, A, B>(
28+
self: Kind<F, R, O, E, A>,
29+
to: (a: A) => B,
30+
from: (b: B) => A
31+
): Kind<F, R, O, E, B>
32+
}
33+
}
34+
35+
export interface Covariant<F extends TypeLambda> extends Invariant<F> {
36+
readonly map: {
37+
<A, B>(f: (a: A) => B): <R, O, E>(self: Kind<F, R, O, E, A>) => Kind<F, R, O, E, B>
38+
<R, O, E, A, B>(self: Kind<F, R, O, E, A>, f: (a: A) => B): Kind<F, R, O, E, B>
39+
}
40+
}
41+
42+
43+
export type Kind<F extends TypeLambda, In, Out2, Out1, Target> = F extends {
44+
readonly type: unknown
45+
} ? (F & {
46+
readonly In: In
47+
readonly Out2: Out2
48+
readonly Out1: Out1
49+
readonly Target: Target
50+
})["type"]
51+
: {
52+
readonly F: F
53+
readonly In: Types.Contravariant<In>
54+
readonly Out2: Types.Covariant<Out2>
55+
readonly Out1: Types.Covariant<Out1>
56+
readonly Target: Types.Invariant<Target>
57+
}
58+
59+
export interface SemiProduct<F extends TypeLambda> extends Invariant<F> {
60+
readonly product: <R1, O1, E1, A, R2, O2, E2, B>(
61+
self: Kind<F, R1, O1, E1, A>,
62+
that: Kind<F, R2, O2, E2, B>
63+
) => Kind<F, R1 & R2, O1 | O2, E1 | E2, [A, B]>
64+
65+
readonly productMany: <R, O, E, A>(
66+
self: Kind<F, R, O, E, A>,
67+
collection: Iterable<Kind<F, R, O, E, A>>
68+
) => Kind<F, R, O, E, [A, ...Array<A>]>
69+
}
70+
export interface SemiApplicative<F extends TypeLambda> extends SemiProduct<F>, Covariant<F> { }
71+
72+
73+
export const SK = <A, B>(_: A, b: B): B => b;
74+
75+
export declare const dual: {
76+
<DataLast extends (...args: Array<any>) => any, DataFirst extends (...args: Array<any>) => any>(
77+
arity: Parameters<DataFirst>["length"],
78+
body: DataFirst
79+
): DataLast & DataFirst
80+
<DataLast extends (...args: Array<any>) => any, DataFirst extends (...args: Array<any>) => any>(
81+
isDataFirst: (args: IArguments) => boolean,
82+
body: DataFirst
83+
): DataLast & DataFirst
84+
};
85+
86+
export const zipWith = <F extends TypeLambda>(F: SemiApplicative<F>): {
87+
<R2, O2, E2, B, A, C>(
88+
that: Kind<F, R2, O2, E2, B>,
89+
f: (a: A, b: B) => C
90+
): <R1, O1, E1>(self: Kind<F, R1, O1, E1, A>) => Kind<F, R1 & R2, O2 | O1, E2 | E1, C>
91+
<R1, O1, E1, A, R2, O2, E2, B, C>(
92+
self: Kind<F, R1, O1, E1, A>,
93+
that: Kind<F, R2, O2, E2, B>,
94+
f: (a: A, b: B) => C
95+
): Kind<F, R1 & R2, O1 | O2, E1 | E2, C>
96+
} =>
97+
dual(
98+
3,
99+
<R1, O1, E1, A, R2, O2, E2, B, C>(
100+
self: Kind<F, R1, O1, E1, A>,
101+
that: Kind<F, R2, O2, E2, B>,
102+
f: (a: A, b: B) => C
103+
): Kind<F, R1 & R2, O1 | O2, E1 | E2, C> => F.map(F.product(self, that), ([a, b]) => f(a, b))
104+
);
105+
106+
107+
export const zipRight = <F extends TypeLambda>(F: SemiApplicative<F>): {
108+
<R2, O2, E2, B>(
109+
that: Kind<F, R2, O2, E2, B>
110+
): <R1, O1, E1, _>(self: Kind<F, R1, O1, E1, _>) => Kind<F, R1 & R2, O2 | O1, E2 | E1, B>
111+
<R1, O1, E1, _, R2, O2, E2, B>(
112+
self: Kind<F, R1, O1, E1, _>,
113+
that: Kind<F, R2, O2, E2, B>
114+
): Kind<F, R1 & R2, O1 | O2, E1 | E2, B>
115+
} =>
116+
dual(2, <R1, O1, E1, _, R2, O2, E2, B>(
117+
self: Kind<F, R1, O1, E1, _>,
118+
that: Kind<F, R2, O2, E2, B>
119+
): Kind<F, R1 & R2, O1 | O2, E1 | E2, B> => zipWith(F)(self, that, SK));
120+
121+
122+
123+
//// [declarationEmitHigherOrderRetainedGenerics.d.ts]
124+
export interface TypeLambda {
125+
readonly In: unknown;
126+
readonly Out2: unknown;
127+
readonly Out1: unknown;
128+
readonly Target: unknown;
129+
}
130+
export declare namespace Types {
131+
type Invariant<A> = (_: A) => A;
132+
type Covariant<A> = (_: never) => A;
133+
type Contravariant<A> = (_: A) => void;
134+
}
135+
export declare const URI: unique symbol;
136+
export interface TypeClass<F extends TypeLambda> {
137+
readonly [URI]?: F;
138+
}
139+
export interface Invariant<F extends TypeLambda> extends TypeClass<F> {
140+
readonly imap: {
141+
<A, B>(to: (a: A) => B, from: (b: B) => A): <R, O, E>(self: Kind<F, R, O, E, A>) => Kind<F, R, O, E, B>;
142+
<R, O, E, A, B>(self: Kind<F, R, O, E, A>, to: (a: A) => B, from: (b: B) => A): Kind<F, R, O, E, B>;
143+
};
144+
}
145+
export interface Covariant<F extends TypeLambda> extends Invariant<F> {
146+
readonly map: {
147+
<A, B>(f: (a: A) => B): <R, O, E>(self: Kind<F, R, O, E, A>) => Kind<F, R, O, E, B>;
148+
<R, O, E, A, B>(self: Kind<F, R, O, E, A>, f: (a: A) => B): Kind<F, R, O, E, B>;
149+
};
150+
}
151+
export type Kind<F extends TypeLambda, In, Out2, Out1, Target> = F extends {
152+
readonly type: unknown;
153+
} ? (F & {
154+
readonly In: In;
155+
readonly Out2: Out2;
156+
readonly Out1: Out1;
157+
readonly Target: Target;
158+
})["type"] : {
159+
readonly F: F;
160+
readonly In: Types.Contravariant<In>;
161+
readonly Out2: Types.Covariant<Out2>;
162+
readonly Out1: Types.Covariant<Out1>;
163+
readonly Target: Types.Invariant<Target>;
164+
};
165+
export interface SemiProduct<F extends TypeLambda> extends Invariant<F> {
166+
readonly product: <R1, O1, E1, A, R2, O2, E2, B>(self: Kind<F, R1, O1, E1, A>, that: Kind<F, R2, O2, E2, B>) => Kind<F, R1 & R2, O1 | O2, E1 | E2, [A, B]>;
167+
readonly productMany: <R, O, E, A>(self: Kind<F, R, O, E, A>, collection: Iterable<Kind<F, R, O, E, A>>) => Kind<F, R, O, E, [A, ...Array<A>]>;
168+
}
169+
export interface SemiApplicative<F extends TypeLambda> extends SemiProduct<F>, Covariant<F> {
170+
}
171+
export declare const SK: <A, B>(_: A, b: B) => B;
172+
export declare const dual: {
173+
<DataLast extends (...args: Array<any>) => any, DataFirst extends (...args: Array<any>) => any>(arity: Parameters<DataFirst>["length"], body: DataFirst): DataLast & DataFirst;
174+
<DataLast extends (...args: Array<any>) => any, DataFirst extends (...args: Array<any>) => any>(isDataFirst: (args: IArguments) => boolean, body: DataFirst): DataLast & DataFirst;
175+
};
176+
export declare const zipWith: <F extends TypeLambda>(F: SemiApplicative<F>) => {
177+
<R2, O2, E2, B, A, C>(that: Kind<F, R2, O2, E2, B>, f: (a: A, b: B) => C): <R1, O1, E1>(self: Kind<F, R1, O1, E1, A>) => Kind<F, R1 & R2, O2 | O1, E2 | E1, C>;
178+
<R1, O1_1, E1_1, A_1, R2, O2_1, E2_1, B_1, C_1>(self: Kind<F, R1, O1_1, E1_1, A_1>, that: Kind<F, R2, O2_1, E2_1, B_1>, f: (a: A_1, b: B_1) => C_1): Kind<F, R1 & R2, O1_1 | O2_1, E1_1 | E2_1, C_1>;
179+
};
180+
export declare const zipRight: <F extends TypeLambda>(F: SemiApplicative<F>) => {
181+
<R2, O2, E2, B>(that: Kind<F, R2, O2, E2, B>): <R1, O1, E1, _>(self: Kind<F, R1, O1, E1, _>) => Kind<F, R1 & R2, O2 | O1, E2 | E1, B>;
182+
<R1, O1_1, E1_1, __1, R2, O2_1, E2_1, B_1>(self: Kind<F, R1, O1_1, E1_1, __1>, that: Kind<F, R2, O2_1, E2_1, B_1>): Kind<F, R1 & R2, O1_1 | O2_1, E1_1 | E2_1, B_1>;
183+
};

0 commit comments

Comments
 (0)