source: node_modules/es-toolkit/dist/compat/function/curryRight.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: 2.2 KB
Line 
1function curryRight(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 === curryRight.placeholder);
9 const length = partialArgs.length - holders.length;
10 if (length < arity) {
11 return makeCurryRight(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 = curryRightPlaceholder;
19 return wrapper;
20}
21function makeCurryRight(func, arity, partialArgs) {
22 function wrapper(...providedArgs) {
23 const holders = providedArgs.filter(item => item === curryRight.placeholder);
24 const length = providedArgs.length - holders.length;
25 providedArgs = composeArgs(providedArgs, partialArgs);
26 if (length < arity) {
27 return makeCurryRight(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 = curryRightPlaceholder;
35 return wrapper;
36}
37function composeArgs(providedArgs, partialArgs) {
38 const placeholderLength = partialArgs.filter(arg => arg === curryRight.placeholder).length;
39 const rangeLength = Math.max(providedArgs.length - placeholderLength, 0);
40 const args = [];
41 let providedIndex = 0;
42 for (let i = 0; i < rangeLength; i++) {
43 args.push(providedArgs[providedIndex++]);
44 }
45 for (let i = 0; i < partialArgs.length; i++) {
46 const arg = partialArgs[i];
47 if (arg === curryRight.placeholder) {
48 if (providedIndex < providedArgs.length) {
49 args.push(providedArgs[providedIndex++]);
50 }
51 else {
52 args.push(arg);
53 }
54 }
55 else {
56 args.push(arg);
57 }
58 }
59 return args;
60}
61const curryRightPlaceholder = Symbol('curryRight.placeholder');
62curryRight.placeholder = curryRightPlaceholder;
63
64export { curryRight };
Note: See TracBrowser for help on using the repository browser.