Based on version in Underscore-Contrib, but without enforcing unary.
var curry = (function(){
function collectArgs(func, context, argCount, args, newArgs){
args = args.concat(Array.from(newArgs));
if (args.length >= argCount){
return func.apply(context || this, args);
}
return function(){
return collectArgs.call(this, func, context, argCount, args, arguments);
};
}
return function curry(func, context){
return function(){
return collectArgs.call(this, func, context, func.length, [], arguments);
};
};
})();
Shorter version:
function curry(func, context){
let args = [];
return function collectArgs(){
args = args.concat(Array.from(arguments));
if (args.length >= func.length){
return func.apply(context || this, args);
}
return function(){
return collectArgs.apply(this, arguments);
}
};
}