Parcourir la source

Change of plans; represent tasks/operations as flow graphs instead of ASTs.

Paul Downen il y a 14 ans
Parent
commit
bcc95eda08
4 fichiers modifiés avec 50 ajouts et 33 suppressions
  1. 0 5
      include/ebb_pipe.hrl
  2. 0 7
      include/ebb_prim.hrl
  3. 32 10
      src/ebb_pipe.erl
  4. 18 11
      src/ebb_prim.erl

+ 0 - 5
include/ebb_pipe.hrl

@@ -1,5 +0,0 @@
--record(pipe, {ops}).
-
--record(feed, {task, op}).
-
--record(sequence, {tasks}).

+ 0 - 7
include/ebb_prim.hrl

@@ -1,7 +0,0 @@
--record(thunk, {code}).
-
--record(func, {code}).
-
--record(dynamic, {code}).
-
--record(return, {val}).

+ 32 - 10
src/ebb_pipe.erl

@@ -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]).

+ 18 - 11
src/ebb_prim.erl

@@ -1,33 +1,40 @@
 -module(ebb_prim).
--include("../include/ebb_prim.hrl").
--include("../include/ebb_pipe.hrl").
 -export([task/2, task/1, return/1,
 	 func/1, app/2, dynamic/1,
 	 ignore/1, nop/0, id/0]).
 
 task(Func, Arg) ->
-    apply(func(Func), Arg).
+    app(dynamic(Func), return(Arg)).
 
 task(Thunk) ->
-    #thunk{code=Thunk}.
+    V = flow_graph:void(),
+    D = flow_graph:delayed(),
+    flow_graph:from_list(V, D, [flow_graph:dynamic(V, D, Thunk)]).
 
 return(Val) ->
-    #return{val=Val}.
+    flow_graph:singleton(flow_graph:value(Val)).
 
 func(Func) ->
-    #func{code=Func}.
+    In = flow_graph:hole(),
+    Out = flow_graph:hole(),
+    flow_graph:from_list(In, Out, [flow_graph:func(In, Out, Func)]).
 
 app(Op, Arg) ->
-    #feed{task=return(Arg), op=Op}.
+    flow_graph:append(flow_graph:singleton(flow_graph:value(Arg)), Op).
 
 dynamic(FuncT) ->
-    #dynamic{code=FuncT}.
+    In = flow_graph:hole(),
+    D = flow_graph:delayed(),
+    flow_graph:from_list(In, D, [flow_graph:dynamic(In, D, FuncT)]).
 
 ignore(Task) ->
-    dynamic(fun(_) -> Task end).
+    H = flow_graph:hole(),
+    V = flow_graph:void(),
+    I = flow_graph:from_list(H, V, [flow_graph:flow(H, V)]),
+    flow_graph:append(I, Task).
 
 nop() ->
-    #return{val='nop'}.
+    flow_graph:singleton(flow_graph:value('nop')).
 
 id() ->
-    #pipe{ops=[]}.
+    flow_graph:singleton(flow_graph:hole()).