1 |
|
2 | import createAsyncPair from "./channel.js";
|
3 | import map from "./array-like/map.js";
|
4 | import passthrough from "./renderer/index.js";
|
5 | import composeAsyncTransformer from "./compose-async-transformers.js";
|
6 | export default (...programs: Array<any>) => (initialRequest: Function) => {
|
7 | let [
|
8 | lastProgram: AsyncGenerator<any, void, any>,
|
9 | lastInit: any,
|
10 | lastA: Function,
|
11 | lastB: Function
|
12 | ] = programs.pop();
|
13 | let request = initialRequest;
|
14 | for (const output of programs) {
|
15 | let program, init, a, b;
|
16 | if (typeof output === "function") {
|
17 | program = output;
|
18 | a = b = $ => $;
|
19 | } else {
|
20 | program = output[0];
|
21 | init = output[1];
|
22 | a = output[2];
|
23 | b = output[3];
|
24 | }
|
25 | const [requestNext, respond] = createAsyncPair();
|
26 | passthrough(
|
27 | program(init, composeAsyncTransformer(a, request)),
|
28 | composeAsyncTransformer(respond, b)
|
29 | );
|
30 | request = requestNext;
|
31 | }
|
32 |
|
33 | return map(
|
34 | lastProgram(lastInit, composeAsyncTransformer(lastA, request)),
|
35 | lastB
|
36 | );
|
37 | };
|