Tengo el siguiente código en el que he envuelto funciones para lograr el comportamiento anterior. Pero desafortunadamente devuelve el resultado esperado solo cuando el número de parámetros es igual a 2.
function baseCurry (func) { return function (...args) { if (args.length >= func.length) { return func.call(this, ...args) } else { return baseCurry(func.bind(this, ...args)) } } } function addHelper (x, y) { return x + y; } const superCurry = baseCurry(addHelper);
Casos de prueba:
console.log(superCurry(1, 5)); // 6 console.log(superCurry(1)(5)); // 6 console.log(superCurry(1)); // [Function (anonymous)] console.log(superCurry(1)(2)(3)); // Error console.log(superCurry(1,2)(3)); // Error
Necesito cambiarlo de tal manera que dé el resultado esperado para todos los n >= 1
, donde 'n' es el número de parámetros
Nota:
Los parámetros se pueden pasar en cualquier combinación como
console.log(superCurry(1,2)(3)(4)) console.log(superCurry(1,2,3)(5,7)(4)(8,9))
Gracias por adelantado
Podría hacer algo similar a su expectativa, pero necesito un par adicional de ()
al final de la cadena de llamadas para que la function
sepa cuándo se devolverá una function
y cuándo el valor.
function baseCurry (func, value) { this.value = value ?? 0; return (...args) => { if (args.length === 0) { let val = this.value; this.value = 0; return val; } for (let index = 0; index < args.length; index += func.length - 1) { this.value = func(this.value, ...args.slice(index, (index + func.length - 1 <= args.length) ? index + func.length - 1 : undefined)); } return baseCurry(func, this.value); } } function addHelper (x, y) { return x + y; } const superCurry = baseCurry(addHelper); console.log(superCurry(1, 5)()); console.log(superCurry(1)(5)()); console.log(superCurry(1)()); console.log(superCurry(1)(2)(3)()); console.log(superCurry(1,2)(3)()); console.log(superCurry(1,2,3)());