funcifyr.js
function(fn) {
        return function curried() {
          var gatheredArgs = [].slice.call(arguments);

          if ( gatheredArgs.length >= fn.length ) {
            return fn.apply(null, gatheredArgs);
          }

          return function(innerArg) {
            var newArgs = [].concat(gatheredArgs, innerArg);
            return curried.apply(null, newArgs);
          }
        }
      }
function(fn) {
        return function curried() {
          var gatheredArgs = [].slice.call(arguments);

          if ( gatheredArgs.length >= fn.length ) {
            return fn.apply(null, gatheredArgs);
          }

          return function(innerArg) {
            var newArgs = [].concat(gatheredArgs, innerArg);
            return curried.apply(null, newArgs);
          }
        }
      }
function ( fn ) { return function curried ( ) { var gatheredArgs = [ ] . slice . call ( arguments ) ; if ( gatheredArgs . length >= fn . length ) { return fn . apply ( null , gatheredArgs ) ; } return function ( innerArg ) { var newArgs = [ ] . concat ( gatheredArgs , innerArg ) ; return curried . apply ( null , newArgs ) ; } } }
Takes a variadic function and returns unary functions until all parameters are used.

curry :: (fn → (a,b,c,d)) → (a) → (b) → (c) → (d) → r

@param fn - A function to be curried
@returns The curried function
@param arguments - Any arguments passed
@returns Either the result of original function if all params were used, OR a unary function
@param innerArg
@returns Call to curried function with additional arg
Takes a variadic function and returns unary functions until all parameters are used .