'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); });