Skip to content

Commit 14724a0

Browse files
committed
Accept new baselines (break is due to #29919)
1 parent f5110fe commit 14724a0

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
ramdaToolsNoInfinite.ts(115,27): error TS2370: A rest parameter must be of an array type.
2+
3+
4+
==== ramdaToolsNoInfinite.ts (1 errors) ====
5+
// All the following types are explained here:
6+
// https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab
7+
// https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts
8+
declare namespace Tools {
9+
type Head<T extends any[]> =
10+
T extends [any, ...any[]]
11+
? T[0]
12+
: never;
13+
14+
type Tail<T extends any[]> =
15+
((...t: T) => any) extends ((_: any, ...tail: infer TT) => any)
16+
? TT
17+
: [];
18+
19+
type HasTail<T extends any[]> =
20+
T extends ([] | [any])
21+
? false
22+
: true;
23+
24+
type Last<T extends any[]> = {
25+
0: Last<Tail<T>>;
26+
1: Head<T>;
27+
}[
28+
HasTail<T> extends true
29+
? 0
30+
: 1
31+
];
32+
33+
type Length<T extends any[]> =
34+
T['length'];
35+
36+
type Prepend<E, T extends any[]> =
37+
((head: E, ...args: T) => any) extends ((...args: infer U) => any)
38+
? U
39+
: T;
40+
41+
type Drop<N extends number, T extends any[], I extends any[] = []> = {
42+
0: Drop<N, Tail<T>, Prepend<any, I>>;
43+
1: T;
44+
}[
45+
Length<I> extends N
46+
? 1
47+
: 0
48+
];
49+
50+
type Cast<X, Y> = X extends Y ? X : Y;
51+
52+
type Pos<I extends any[]> =
53+
Length<I>;
54+
55+
type Next<I extends any[]> =
56+
Prepend<any, I>;
57+
58+
type Prev<I extends any[]> =
59+
Tail<I>;
60+
61+
type Iterator<Index extends number = 0, From extends any[] = [], I extends any[] = []> = {
62+
0: Iterator<Index, Next<From>, Next<I>>;
63+
1: From;
64+
}[
65+
Pos<I> extends Index
66+
? 1
67+
: 0
68+
];
69+
70+
type Reverse<T extends any[], R extends any[] = [], I extends any[] = []> = {
71+
0: Reverse<T, Prepend<T[Pos<I>], R>, Next<I>>;
72+
1: R;
73+
}[
74+
Pos<I> extends Length<T>
75+
? 1
76+
: 0
77+
];
78+
79+
type Concat<T1 extends any[], T2 extends any[]> =
80+
Reverse<Reverse<T1> extends infer R ? Cast<R, any[]> : never, T2>;
81+
82+
type Append<E, T extends any[]> =
83+
Concat<T, [E]>;
84+
85+
type ValueOfRecord<R> = R extends Record<any, infer T> ? T : never;
86+
}
87+
88+
declare namespace R {
89+
export type Placeholder = { __placeholder: void };
90+
}
91+
92+
declare namespace Curry {
93+
type GapOf<T1 extends any[], T2 extends any[], TN extends any[], I extends any[]> =
94+
T1[Tools.Pos<I>] extends R.Placeholder
95+
? Tools.Append<T2[Tools.Pos<I>], TN>
96+
: TN;
97+
98+
interface GapsOfWorker<T1 extends any[], T2 extends any[], TN extends any[] = [], I extends any[] = []> {
99+
0: GapsOf<T1, T2, GapOf<T1, T2, TN, I> extends infer G ? Tools.Cast<G, any[]> : never, Tools.Next<I>>;
100+
1: Tools.Concat<TN, Tools.Drop<Tools.Pos<I>, T2> extends infer D ? Tools.Cast<D, any[]> : never>;
101+
}
102+
type GapsOf<T1 extends any[], T2 extends any[], TN extends any[] = [], I extends any[] = []> = GapsOfWorker<T1, T2, TN, I>[
103+
Tools.Pos<I> extends Tools.Length<T1>
104+
? 1
105+
: 0
106+
];
107+
108+
type PartialGaps<T extends any[]> = {
109+
[K in keyof T]?: T[K] | R.Placeholder
110+
};
111+
112+
type CleanedGaps<T extends any[]> = {
113+
[K in keyof T]: NonNullable<T[K]>
114+
};
115+
116+
type Gaps<T extends any[]> = CleanedGaps<PartialGaps<T>>;
117+
118+
type Curry<F extends ((...args: any) => any)> =
119+
<T extends any[]>(...args: Tools.Cast<Tools.Cast<T, Gaps<Parameters<F>>>, any[]>) =>
120+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121+
!!! error TS2370: A rest parameter must be of an array type.
122+
GapsOf<T, Parameters<F>> extends [any, ...any[]]
123+
? Curry<(...args: GapsOf<T, Parameters<F>> extends infer G ? Tools.Cast<G, any[]> : never) => ReturnType<F>>
124+
: ReturnType<F>;
125+
}
126+

0 commit comments

Comments
 (0)