rubico
Version:
[a]synchronous functional programming
47 lines (43 loc) • 1.22 kB
JavaScript
const isPromise = require('./isPromise')
const thunkify2 = require('./thunkify2')
// _iteratorForEachSeriesAsync(
// iterator Iterator,
// callback function,
// ) -> Promise<iterator>
const _iteratorForEachSeriesAsync = async function (iterator, callback) {
let iteration = iterator.next()
while (!iteration.done) {
const operation = callback(iteration.value)
if (isPromise(operation)) {
await operation
}
iteration = iterator.next()
}
return iterator
}
/**
* @name iteratorForEachSeries
*
* @synopsis
* ```coffeescript [specscript]
* iteratorForEachSeries(iterator Iterator, callback function) -> iterator
* ```
*
* @description
* Call a callback for each item of an iterator. Return a promise if any executions are asynchronous.
*
* Note: iterator is consumed
*/
const iteratorForEachSeries = function (iterator, callback) {
let iteration = iterator.next()
while (!iterator.done) {
const operation = callback(iteration.value)
if (isPromise(operation)) {
return operation
.then(thunkify2(_iteratorForEachSeriesAsync, iterator, callback))
}
iteration = iterator.next()
}
return iterator
}
module.exports = iteratorForEachSeries