瀏覽代碼

Added better support for tuples in ebb_flow.

Paul Downen 14 年之前
父節點
當前提交
80202f1a8e
共有 1 個文件被更改,包括 27 次插入20 次删除
  1. 27 20
      src/ebb_flow.erl

+ 27 - 20
src/ebb_flow.erl

@@ -45,18 +45,24 @@ func(F) ->
 func(F, N) ->
     ebb_prim:pipe([ebb_prim:func(F), ebb_prim:split(N)]).
 
-pipe(Xs = [_|_]) ->
-    ebb_prim:pipe([ to_op(X) || X <- Xs ]);
-pipe(X) ->
-    to_op(X).
+pipe(Xs) ->
+    case {ebb_prim:is_operation(Xs), is_list(Xs), is_tuple(Xs)} of
+	{true, _, _} -> Xs;
+	{_, true, _} -> ebb_prim:pipe([ to_op(X) || X <- Xs ]);
+	{_, _, true} -> ebb_prim:pipe([ to_op(X) || X <- tuple_to_list(Xs) ]);
+	{_, _, _}    -> to_op(Xs)
+    end.
 
 pipe(X, Y) ->
     pipe([X, Y]).
 
-par(Xs = [_|_]) ->
-    ebb_prim:par([ to_op(X) || X <- Xs ]);
-par(X) ->
-    to_op(X).
+par(Xs) ->
+    case {ebb_prim:is_operation(Xs), is_list(Xs), is_tuple(Xs)} of
+	{true, _, _} -> Xs;
+	{_, true, _} -> ebb_prim:par([ to_op(X) || X <- Xs ]);
+	{_, _, true} -> ebb_prim:par([ to_op(X) || X <- tuple_to_list(Xs) ]);
+	{_, _, _}    -> to_op(Xs)
+    end.
 
 par(X, Y) ->
     par([X, Y]).
@@ -92,10 +98,12 @@ switch(Branches) ->
     ebb_prim:switch([ {Tag, to_op(X)} || {Tag, X} <- Branches ]).
 
 to_op(X) ->
-    case {ebb_prim:is_operation(X), is_function(X)} of
-	{true,  false} -> X;
-	{false, true}  -> func(X);
-	{false, false} -> value(X)
+    case {ebb_prim:is_operation(X), is_function(X), is_list(X), is_tuple(X)} of
+	{true, _, _, _} -> X;
+	{_, true, _, _} -> ebb_prim:func(X);
+	{_, _, true, _} -> ebb_prim:par([ to_op(Y) || Y <- X ]);
+	{_, _, _, true} -> ebb_prim:par([ to_op(Y) || Y <- tuple_to_list(X) ]);
+	{_, _, _, _}    -> ebb_prim:value(X)
     end.
 
 par_pipes(Args) ->
@@ -104,14 +112,13 @@ par_pipes(Args) ->
 pipe_pars(Args) ->
     ebb_prim:pipe([ nested_operation(X, fun par_pipes/1) || X <- Args ]).
 
-nested_operation(Ops, Continue) when is_list(Ops) ->
-    Continue(Ops);
-nested_operation(F, _Continue) when is_function(F) ->
-    ebb_prim:func(F);
-nested_operation(X, _Continue) ->
-    case ebb_prim:is_operation(X) of
-	true  -> X;
-        false -> ebb_prim:value(X)
+nested_operation(X, Continue) ->
+    case {ebb_prim:is_operation(X), is_function(X), is_list(X), is_tuple(X)} of
+	{true, _, _, _} -> X;
+	{_, true, _, _} -> ebb_prim:func(X);
+	{_, _, true, _} -> Continue(X);
+	{_, _, _, true} -> Continue(tuple_to_list(X));
+	{_, _, _, _}    -> ebb_prim:value(X)
     end.
 
 %%%-----------------------------------------------------------------------------