Skip to content

Instantly share code, notes, and snippets.

@martin-mok
Created January 11, 2020 22:25
Show Gist options
  • Select an option

  • Save martin-mok/733438937df27f3ba948c6eb6e4dc227 to your computer and use it in GitHub Desktop.

Select an option

Save martin-mok/733438937df27f3ba948c6eb6e4dc227 to your computer and use it in GitHub Desktop.
implementation of curry function javascript

A GENTLE INTRODUCTION TO FUNCTIONAL JAVASCRIPT: PART 3

function curry (fn) {
    var arity = fn.length;

    function given (argsSoFar) {
        return function helper () {
            var args             = Array.prototype.slice.call(arguments, 0);
            var updatedArgsSoFar = argsSoFar.concat(args);

            if (updatedArgsSoFar.length >= arity) {
                return fn.apply(this, updatedArgsSoFar);
            }
            else {
                return given(updatedArgsSoFar);
            }
        }
    }

    return given([]);
}

Understanding Currying in JavaScript

function curry(fn, ...args) {
    return (..._arg) => {
        return fn(...args, ..._arg);
    }
}

Currying in JavaScript

const curry = (fn, ...args) =>
  (fn.length <= args.length) ?
    fn(...args) :
    (...more) => curry(fn, ...args, ...more);

Advanced curry implementation

function curry(func) {
  return function curried(...args) {
    if (args.length >= func.length) {
      return func.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment