toolchest.js
function curry (fn, ...args) {
  if (args.length >= fn.length) {
    return fn.apply(null, args)
  } else {
    return function (...rest) {
      return curry(fn, ...args, ...rest)
    }
  }
}
function curry (fn, ...args) {
  if (args.length >= fn.length) {
    return fn.apply(null, args)
  } else {
    return function (...rest) {
      return curry(fn, ...args, ...rest)
    }
  }
}
function curry ( fn , ... args ) { if ( args . length >= fn . length ) { return fn . apply ( null , args ) } else { return function ( ... rest ) { return curry ( fn , ... args , ... rest ) } } }
The All Mighty Curry!
Any extra arguments are to be handled by the curried function.

Note: Default and Rest parameters are not accounted for in Function#length.
So the curried function will be called as soon as it has recieved all regular
parameters. To utilize Rest parameters use curryN

By the way, the spread operator is so cool!
The All Mighty Curry! Any extra arguments are to be handled by the curried function .