¿Por qué al principio obtengo 80, luego 88 y luego 90? ¿Alguien puede explicar en detalle lo que está sucediendo en la función de compose ?
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); const sum = a => b => a + b const multiply = a => b => a * b const addTransactionFee = sum(2) const addTax = multiply(1.1) const addMonthlyPromotion = multiply(0.8) const log = a => { console.log(a) return a } const paymentAmount = compose( log, addTransactionFee, log, addTax, log, addMonthlyPromotion )(100)En su lugar, puede utilizar la recursividad. De esta forma se conserva (y no se invierte) el orden de las funciones.
const recursion = (value, func, ...fns) => func ? recursion(func(value), ...fns) : value; const paymentAmount = (amount) => recursion( amount, log, addTransactionFee, log, addTax, log, addMonthlyPromotion, log );La función de composición con el ciclo de reduce... tome la función correcta (la última ( addMonthlyPromotion() )) y obtenga el resultado de 100 * 0.8 para que tenga 80 en el primer ciclo. Luego tienes el segundo ciclo con la segunda función ( addTax() ) multiplica el resultado anterior de (80) con 1.1 entonces 88. Y el ciclo final y el tercero de reducir con la función ( addTransactionFee() ) agrega 2 en su número anterior por lo que 90.
Ahora la función de composición va de derecha a izquierda de la función en bucle y realiza los cálculos.