const add1 = x => x + 1;
const mul3 = x => x * 3;
const div2 = x => x / 2;
// var result = div2(mul3(add1(0)))
// console.log(result) // -> 1.5
/**
* funcs:存储的是最后需要执行的函数及其顺序(最后传递的函数优先执行)
* + 执行compose只是把最后要执行的函数及顺序事先存储起来,函数还没有执行「柯里化思想」
* + 返回一个operate处理函数,执行operate,并且传递初始值,才按照之前存储的函数及顺序依次执行函数
*/
// // 0.无兼容报错实现
// function compose(...funcs) {// funcs -> [div2,mul3,add1]
// return function operate(x) {
// return funcs.reduceRight(function (result, item) {
// return item(result)
// }, x)
// }
// }
// 1.兼容实现
function compose(...funcs) {// funcs -> [div2,mul3,add1]
return function operate(x) {
if (funcs.length === 0) return x;
if (funcs.length === 1) return typeof funcs[0] === "function" ? funcs[0](x) : x;
return funcs.reduceRight(function (result, item) {
if (typeof item !== 'function') return result
return item(result)
}, x)
}
}
// // 2.更简化的实现redux *待解决:第六期中有
// function compose(...funcs) {
// if (funcs.length === 0) return arg => arg;
// if (funcs.length === 1) return funcs[0];
// return funcs.reduce((a, b) => (...args) => a(b(...args)))
// }
const operate = compose(div2, mul3, add1)
var result = operate(0)
console.log(result)