使用generator處理無限數據流

Example

假設現在有一個數據非常多的數組,但是我們只需要它的前幾個數據,并且進行一定的操作,這時候可以使用 generator 來進行 take 的操作.

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
32
33
34
35
36
37
38
39
40
41
42
43
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
const from = (arr) => arr[Symbol.iterator]()

const filter = (f) =>
function* (iter) {
let v = iter.next()
while (!v.done) {
if (f(v.value)) yield v.value
v = iter.next()
}
}

const multipy = (n) =>
function* (iter) {
let v = iter.next()
while (!v.done) {
yield v.value * n
v = iter.next()
}
}

const take = (n) =>
function* (iter) {
let i = 0
let v = iter.next()
while (!v.done && i < n) {
yield v.value
i++
v = iter.next()
}
}

const pipe = (...arr) => arr.reduce((acc, func) => func(acc))

console.log([
...pipe(
from(arr),
filter((v) => v % 2 === 0),
multipy(3),
take(30),
filter((v) => v > 15)
),
]) // [18, 24, 30, 36]