UNPKG

1.04 kBJavaScriptView Raw
1//@flow
2import createAsyncPair from "./channel.js";
3import map from "./array-like/map.js";
4import passthrough from "./renderer/index.js";
5import composeAsyncTransformer from "./compose-async-transformers.js";
6export 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 //handle last
33 return map(
34 lastProgram(lastInit, composeAsyncTransformer(lastA, request)),
35 lastB
36 );
37};