Currying com funções que recebem argumentos ilimitados
Vamos dizer que eu tenho a seguinte função add que requer um número ilimitado de argumentos.
function add () {
var total = 0;
var args = Array.prototype.slice.call(arguments, 0);
for (var i=0; i<args.length; i++) {
total += arguments[i];
}
return total;
}
e a seguinte função curry.
function curryFunction(orig_func) {
var ap = Array.prototype;
var args = arguments;
function fn() {
if (arguments.length != 0) {
ap.push.apply(fn.args, arguments);
return fn;
} else {
return orig_func.apply(this, fn.args);
}
};
return function() {
fn.args = ap.slice.call( args, 1 );
return fn.apply( this, arguments );
};
}
Eu quero fazer algo como:
var f = curryFunction(add);
var a = f(3)(4)(3);
var b = f(10)(3);
var result1 = a(); // returns 10
var result2 = b(); // returns 13
No entanto, eu sempre recebo 13 para ambos a () eb (), eu assumo é porque na linha
fn.args = ap.slice.call(args, 1);
a matriz existente [3,4,3] está substituindo por []. Alguém pode me dar uma dica de como fazer isso funcionar? obrigado