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

questionAnswers(2)

yourAnswerToTheQuestion