Implement curry(fn) so that a function taking N arguments can be called as f(a)(b)(c) or f(a, b)(c) until all N are supplied.
Track collected arguments; if enough have been gathered (>= fn.length), invoke the original; otherwise return a function that collects more. Currying enables partial application and reusable specialized functions.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) return fn.apply(this, args);
return (...next) => curried.apply(this, [...args, ...next]);
};
}
// const add = curry((a, b, c) => a + b + c);
// add(1)(2)(3) === add(1, 2)(3) === 6Currying builds reusable, pre-configured helpers — e.g. a logger curried with a level, or an assertion curried with a fixed tolerance in a test framework.
curry stops working when the target function uses a default parameter, e.g. (a, b = 2) => a + b. Why?