浏览代码

Fixed bug with reversed operations in ebb_run:simpl_pipe_par.

Paul Downen 14 年之前
父节点
当前提交
3ba43f00fc
共有 1 个文件被更改,包括 25 次插入18 次删除
  1. 25 18
      src/ebb_run.erl

+ 25 - 18
src/ebb_run.erl

@@ -60,12 +60,15 @@ list_output(X) ->
 %%% Simplification
 %%%-----------------------------------------------------------------------------
 
-simpl(Op = #pipe{ops=Inside}) ->
-    flatten(Op#pipe{ops=simpl_pipe([ simpl(O) || O <- Inside ])});
-simpl(Op = #par{ops=Inside}) ->
-    flatten(Op#par{ops=simpl_par([ simpl(O) || O <- Inside ])});
+simpl(#pipe{ops=Inside}) ->
+    flatten(ebb_prim:pipe(simpl_pipe([ simpl(O) || O <- Inside ])));
+simpl(#par{ops=Inside}) ->
+    flatten(ebb_prim:par(simpl_par([ simpl(O) || O <- Inside ])));
 simpl(Op) ->
-    Op.
+    case ebb_prim:is_operation(Op) of
+	true  -> Op;
+	false -> erlang:error(badarg, [Op])
+    end.
 
 simpl_pipe(Ops) ->
     lists:reverse(lists:foldl(fun simpl_pipe/2, [], Ops)).
@@ -88,17 +91,22 @@ simpl_pipe(#merge{size=N}, [#split{size=N} | Acc]) ->
 simpl_pipe(Op, Acc) ->
     [Op | Acc].
 
-simpl_pipe_par(Par1 = #par{in=In, ops=Ops1}, Par2 = #par{out=Out, ops=Ops2}) ->
-    ZOps = lists:zip(Ops1, Ops2),
-    Match = lists:all(fun({O1,O2}) -> ebb_prim:can_connect(O1, O2) end, ZOps),
-    case Match of
-	true -> [#par{in=In, out=Out,
-		      ops=[ ebb_prim:pipe([O1,O2]) || {O1, O2} <- ZOps ]}];
-	false -> [Par1, Par2]
+simpl_pipe_par(Par1 = #par{ops=Ops1}, Par2 = #par{ops=Ops2}) ->
+    try
+	ZOps = lists:zip(Ops1, Ops2),
+	{lists:all(fun({O1,O2}) -> ebb_prim:can_connect(O1, O2) end, ZOps),
+	 ZOps}
+    of
+	{true, Ops} ->
+	    [ebb_prim:par([ ebb_prim:pipe([O1,O2]) || {O1, O2} <- Ops ])];
+	{false, _} ->
+	    [Par2, Par1]
+    catch
+	error:function_clause -> [Par2, Par1]
     end.
 
-simpl_pipe_route(#route{in=In, map=M1}, #route{out=Out, map=M2}) ->
-    #route{in=In, out=Out, map=[ lists:nth(I, M1) || I <- M2 ]}.
+simpl_pipe_route(#route{in=In, map=M1}, #route{map=M2}) ->
+    ebb_prim:route(In, [ lists:nth(I, M1) || I <- M2 ]).
 
 simpl_par(Ops) ->
     lists:reverse(lists:foldl(fun simpl_par/2, [], Ops)).
@@ -112,10 +120,9 @@ simpl_par(R2 = #route{}, [R1 = #route{} | Acc]) ->
 simpl_par(Op, Acc) ->
     [Op | Acc].
 
-simpl_par_route(#route{in=In1, out=Out1, map=M1},
-		#route{in=In2, out=Out2, map=M2}) ->
-    #route{in=In1+In2, out=Out1+Out2,
-	   map=lists:append(M1, [ S2+In1 || S2 <- M2 ])}.
+simpl_par_route(#route{in=In1, map=M1}, #route{in=In2, map=M2}) ->
+    ebb_prim:route(In1+In2,
+		   lists:append(M1, [ S2+In1 || S2 <- M2 ])).
 
 flatten(#pipe{in=N, out=N, ops=[]}) ->
     ebb_flow:id(N);