Overview
Implement curry(fn) supporting:
- Placeholder
curry.placeholderfor skipping arguments - Variadic argument collection
- Replaces placeholders left-to-right
Examples
const _ = curry.placeholder; const add = curry((a,b,c) => a+b+c); add(1)(2)(3); // 6 add(_,2)(1,3); // 6 add(1,_,3)(2); // 6
Solution
Reveal solution
function curry(fn) {
const _ = curry.placeholder;
return function curried(...args) {
const complete = args.length >= fn.length && args.slice(0, fn.length).every(a => a !== _);
if (complete) return fn(...args);
return function(...next) {
const merged = [];
let ni = 0;
for (let i = 0; i < args.length; i++) {
if (args[i] === _ && ni < next.length) merged.push(next[ni++]);
else merged.push(args[i]);
}
while (ni < next.length) merged.push(next[ni++]);
return curried(...merged);
};
};
}
curry.placeholder = Symbol('_');curry-ii.js
Curry II
hardcodingJavaScriptFunctions
Overview
Implement curry(fn) supporting:
- Placeholder
curry.placeholderfor skipping arguments - Variadic argument collection
- Replaces placeholders left-to-right
Examples
const _ = curry.placeholder; const add = curry((a,b,c) => a+b+c); add(1)(2)(3); // 6 add(_,2)(1,3); // 6 add(1,_,3)(2); // 6
Solution
Reveal solution
function curry(fn) {
const _ = curry.placeholder;
return function curried(...args) {
const complete = args.length >= fn.length && args.slice(0, fn.length).every(a => a !== _);
if (complete) return fn(...args);
return function(...next) {
const merged = [];
let ni = 0;
for (let i = 0; i < args.length; i++) {
if (args[i] === _ && ni < next.length) merged.push(next[ni++]);
else merged.push(args[i]);
}
while (ni < next.length) merged.push(next[ni++]);
return curried(...merged);
};
};
}
curry.placeholder = Symbol('_');NameTopicDifficulty
103 of 103 problems