1 |
|
2 | async function transduceAsyncIterator (transform, reducerfunction, init, asynciterator) {
|
3 | var reducer = transform(reducerfunction)
|
4 | var n = null
|
5 | do {
|
6 | n = await asynciterator.next()
|
7 | if (!n.done) {
|
8 | var v = n.value
|
9 | init = await reducer(init, v)
|
10 | }
|
11 | } while (!n.done)
|
12 | return init
|
13 | }
|
14 |
|
15 | async function transduceAsyncHasNextIterator (transform, reducerfunction, init, asynchasnextiterator) {
|
16 | var reducer = transform(reducerfunction)
|
17 | var n = null
|
18 | var r = null
|
19 | do {
|
20 | n = await asynchasnextiterator.hasNext()
|
21 | if (n) {
|
22 | var v = await asynchasnextiterator.next()
|
23 | r = await reducer(init, v)
|
24 | if (r.hasOwnProperty('reduced')) {
|
25 | if (r.reduced) {
|
26 | init = r.reduced
|
27 | }
|
28 | } else if (r) {
|
29 | init = r
|
30 | }
|
31 | }
|
32 | } while (r && n)
|
33 | return init
|
34 | }
|
35 |
|
36 | async function transduceArray (xf, rf, init, xs) {
|
37 |
|
38 |
|
39 |
|
40 | var xrf = await xf(rf)
|
41 | return xs.reduce(xrf, init)
|
42 | }
|
43 |
|
44 | async function * transduceGenerator (transform, reducerfunction, init, streamgenerator) {
|
45 | var reducer = transform(reducerfunction)
|
46 | for await (const value of streamgenerator) {
|
47 | var newinit = await reducer(init, value)
|
48 |
|
49 | if (!newinit) {
|
50 | } else if (newinit === init) {
|
51 | } else {
|
52 | if (newinit.hasOwnProperty('reduced')) {
|
53 | if (Array.isArray(newinit.reduced)) {
|
54 | for (var i = 0; i < newinit.reduced.length; i++) {
|
55 | init = newinit.reduced[i]
|
56 | yield newinit.reduced[i]
|
57 | }
|
58 | }
|
59 | } else {
|
60 | init = newinit
|
61 | yield newinit
|
62 | }
|
63 | }
|
64 | }
|
65 | }
|
66 |
|
67 | export {
|
68 | transduceAsyncIterator,
|
69 | transduceAsyncHasNextIterator,
|
70 | transduceArray,
|
71 | transduceGenerator
|
72 | }
|