23 lines
		
	
	
		
			413 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			23 lines
		
	
	
		
			413 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| module.exports = (iterable, reducer, initVal) => new Promise((resolve, reject) => {
 | |
| 	const iterator = iterable[Symbol.iterator]();
 | |
| 	let i = 0;
 | |
| 
 | |
| 	const next = total => {
 | |
| 		const el = iterator.next();
 | |
| 
 | |
| 		if (el.done) {
 | |
| 			resolve(total);
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		Promise.all([total, el.value])
 | |
| 			.then(value => {
 | |
| 				next(reducer(value[0], value[1], i++));
 | |
| 			})
 | |
| 			.catch(reject);
 | |
| 	};
 | |
| 
 | |
| 	next(initVal);
 | |
| });
 |