UNPKG

2.18 kBJavaScriptView Raw
1
2async 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
15async 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
36async function transduceArray (xf, rf, init, xs) {
37 // call reduce on the data structure internally (abstract it away)
38 // pass the rf to the composed transformation
39 // pass in the initial value
40 var xrf = await xf(rf)
41 return xs.reduce(xrf, init)
42}
43
44async 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 // Here we checked if there is new a 'reduced' value and only generate a new value when this is the case
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
67export {
68 transduceAsyncIterator,
69 transduceAsyncHasNextIterator,
70 transduceArray,
71 transduceGenerator
72}