-
Notifications
You must be signed in to change notification settings - Fork 14
/
filter.js
31 lines (26 loc) · 819 Bytes
/
filter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* eslint-disable */
const isThenable = require('../internal/isThenable')
const iterableSerialReduce = require('../internal/iterableSerialReduce')
const asyncFilterReducer = func => (acc, x) => {
const result = func(x)
return isThenable(result)
? result.then(value => (value && acc.push(x), acc))
: (result && acc.push(x), acc)
}
const filter = func => iterable => {
const values = []
const iterator = iterable[Symbol.iterator]()
var { value, done } = iterator.next()
while (!done) {
const result = func(value)
if (isThenable(result)) {
return iterableSerialReduce(asyncFilterReducer(func), null, iterator, result.then(() => [ value ]))
}
if (result) {
values.push(value)
}
var { value, done } = iterator.next()
}
return values
}
module.exports = filter