const reduce = (f, acc, iter)=>{
// 초기값 없을 경우
if(!iter){
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}else{
iter = iter[Symbol.iterator]();
}
let cur;
while(!(cur= iter.next()).done){
const a = cur.value;
acc = f(acc, a);
}
}
- 비동기 제어를 포함한 reduce1 (acc가 비동기값이 된 후에는 계속 비동기를 처리하는 메소드가 체이닝 될 경우에만 동작 , 불안정하다.)
const reduce = (f, acc, iter)=>{
if(!iter){
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}else{
iter = iter[Symbol.iterator]();
}
let cur;
while(!(cur= iter.next()).done){
const a = cur.value;
//acc = f(acc, a);
acc = acc instanceOf Promise ? acc.then(acc => f(acc, a)) : f(acc, a);
}
return acc;
}
const go1 = (a, f) => a instanceOf Promise ? a.then(f): f(a)
const reduce = (f, acc, iter)=>{
if(!iter){
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}else{
iter = iter[Symbol.iterator]();
}
//첫 번째 acc가 promise일 경우를 처리하기위해 , go1 사용
return function go1(acc, recur(acc){
let cur;
while(!(cur= iter.next()).done){
const a = cur.value;
acc = f(acc, a);
if(acc instanceOf Promise) return acc.then(recur);
}
return acc;
})