1 |
|
2 |
|
3 |
|
4 |
|
5 | export function curried<TLeadingParameters extends any[], TLastParameter, TReturn>(
|
6 | fn: (...args: [...TLeadingParameters, TLastParameter]) => TReturn
|
7 | ) {
|
8 | return (...args: TLeadingParameters) =>
|
9 | (curried: TLastParameter) =>
|
10 | fn(...[...args, curried]);
|
11 | }
|
12 |
|
13 | type Leading<T extends any[]> = T extends [...infer I, infer _] ? I : never;
|
14 | type Last<T extends any[]> = T extends [...infer _, infer I] ? I : never;
|
15 |
|
16 | export function overloadWithCurried<F extends (...args: any) => any>(
|
17 | fn: F
|
18 | ): {
|
19 | (...args: Parameters<F>): ReturnType<F>;
|
20 | (...args: Leading<Parameters<F>>): (curried: Last<Parameters<F>>) => ReturnType<F>;
|
21 | } {
|
22 | return (...args) =>
|
23 | args.length == fn.length - 1 ? (curried: any) => fn(...[...args, curried]) : fn(...args);
|
24 | }
|
25 |
|