code: 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);
            }
          }
        }
docs: 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