source: node_modules/es-toolkit/dist/compat/function/curry.mjs

Last change on this file was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 1.9 KB
Line 
1function curry(func, arity = func.length, guard) {
2 arity = guard ? func.length : arity;
3 arity = Number.parseInt(arity, 10);
4 if (Number.isNaN(arity) || arity < 1) {
5 arity = 0;
6 }
7 const wrapper = function (...partialArgs) {
8 const holders = partialArgs.filter(item => item === curry.placeholder);
9 const length = partialArgs.length - holders.length;
10 if (length < arity) {
11 return makeCurry(func, arity - length, partialArgs);
12 }
13 if (this instanceof wrapper) {
14 return new func(...partialArgs);
15 }
16 return func.apply(this, partialArgs);
17 };
18 wrapper.placeholder = curryPlaceholder;
19 return wrapper;
20}
21function makeCurry(func, arity, partialArgs) {
22 function wrapper(...providedArgs) {
23 const holders = providedArgs.filter(item => item === curry.placeholder);
24 const length = providedArgs.length - holders.length;
25 providedArgs = composeArgs(providedArgs, partialArgs);
26 if (length < arity) {
27 return makeCurry(func, arity - length, providedArgs);
28 }
29 if (this instanceof wrapper) {
30 return new func(...providedArgs);
31 }
32 return func.apply(this, providedArgs);
33 }
34 wrapper.placeholder = curryPlaceholder;
35 return wrapper;
36}
37function composeArgs(providedArgs, partialArgs) {
38 const args = [];
39 let startIndex = 0;
40 for (let i = 0; i < partialArgs.length; i++) {
41 const arg = partialArgs[i];
42 if (arg === curry.placeholder && startIndex < providedArgs.length) {
43 args.push(providedArgs[startIndex++]);
44 }
45 else {
46 args.push(arg);
47 }
48 }
49 for (let i = startIndex; i < providedArgs.length; i++) {
50 args.push(providedArgs[i]);
51 }
52 return args;
53}
54const curryPlaceholder = Symbol('curry.placeholder');
55curry.placeholder = curryPlaceholder;
56
57export { curry };
Note: See TracBrowser for help on using the repository browser.