Solution

Advanced curry implementation


function curry(func) {
  // Return a curried version of the original function
  return function curried(...args) {
    // If the number of arguments provided is equal to or greater than
    // the original function's length, invoke the original function
    if (args.length >= func.length) {
      return func.apply(this, args);
    } else {
      // Otherwise, return a function that takes more arguments and
      // combines them with the previous arguments
      return function(...moreArgs) {
        return curried.apply(this, args.concat(moreArgs));
      };
    }
  };
}

// Example usage:
function add(a, b, c) {
  return a + b + c;
}

const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1, 2, 3)); // 6

Summary

  • Currying transforms a function expecting multiple arguments into a sequence of functions, each taking a single argument