|
@@ -1,22 +1,44 @@
|
|
|
-module(ebb_pipe).
|
|
|
--include("../include/ebb_prim.hrl").
|
|
|
--include("../include/ebb_pipe.hrl").
|
|
|
-export([pipe/2, pipe/1, bind/2, feed/2, sequence/2, sequence/1]).
|
|
|
|
|
|
pipe(Op1, Op2) ->
|
|
|
- #pipe{ops=[Op1, Op2]}.
|
|
|
+ flow_graph:append(Op1, Op2).
|
|
|
|
|
|
-pipe(Ops) ->
|
|
|
- #pipe{ops=Ops}.
|
|
|
+pipe([Op|Ops]) ->
|
|
|
+ lists:foldl(fun(O, G) -> pipe(G, O) end, Op, Ops).
|
|
|
|
|
|
bind(Task, FuncT) ->
|
|
|
- feed(Task, #dynamic{code=FuncT}).
|
|
|
+ feed(Task, ebb_prim:dynamic(FuncT)).
|
|
|
|
|
|
feed(Task, Op) ->
|
|
|
- #feed{task=Task, op=Op}.
|
|
|
+ flow_graph:append(Task, Op).
|
|
|
|
|
|
sequence(Task1, Task2) ->
|
|
|
- #sequence{tasks=[Task1, Task2]}.
|
|
|
+ M = flow_graph:merge(),
|
|
|
+ H = flow_graph:hole(),
|
|
|
+ Out1 = flow_graph:get_out(Task1),
|
|
|
+ Out2 = flow_graph:get_out(Task2),
|
|
|
+ T = flow_graph:add_edge_list(
|
|
|
+ link_tasks(Task1, Task2),
|
|
|
+ [flow_graph:flow(Out1,H),
|
|
|
+ flow_graph:index(H,M,1),
|
|
|
+ flow_graph:index(Out2,M,2)]),
|
|
|
+ flow_graph:reroute(T, flow_graph:singleton(M)).
|
|
|
|
|
|
-sequence(Tasks) ->
|
|
|
- #sequence{tasks=Tasks}.
|
|
|
+sequence([Task1]) -> Task1;
|
|
|
+sequence([Task1|Tasks]) ->
|
|
|
+ M = flow_graph:merge(),
|
|
|
+ LinkMerge = fun(N, T) ->
|
|
|
+ H = flow_graph:hole(),
|
|
|
+ Out = flow_graph:get_out(T),
|
|
|
+ {N+1, flow_graph:add_edge_list(
|
|
|
+ T,
|
|
|
+ [flow_graph:flow(Out,H),
|
|
|
+ flow_graph:index(H,M,N)])}
|
|
|
+ end,
|
|
|
+ Add = fun(T, {N, Ts}) -> LinkMerge(N, link_tasks(T, Ts)) end,
|
|
|
+ {_N, Ts} = lists:foldl(Add, LinkMerge(1, Task1), Tasks),
|
|
|
+ flow_graph:reroute(Ts, flow_graph:singleton(M)).
|
|
|
+
|
|
|
+link_tasks(Task1, Task2) ->
|
|
|
+ flow_graph:append([Task1, flow_graph:singleton(flow_graph:void()), Task2]).
|