1 import Base 2 import ./world.bend as W 3 import ./execution_composer_layout.bend as Layout 4 import ./execution_relation_operation.bend as O 5 6 # The closed command declaration binds route and enqueue to the existing Buffer. 7 # These adapters do not allocate a queue or accept a World callback. 8 type Commands<-Q:Type,-S:Data> is Type: 9 Commands{relate:Q -> W.Handle -> W.Handle -> Q,unrelate:Q -> W.Handle -> Q} 10 type HierarchyCommands<-Q:Type,-S:Data> is Type: 11 HierarchyCommands{relations:Commands,reorder:Q -> W.Handle -> List<&2,W.Handle> -> Q} 12 def commands(~S:Data,~Q:Type,~route:Layout.Route,~enqueue:Q -> Layout.Route -> O.Operation -> Q) -> Commands: 13 Commands{queue => source => target => enqueue(queue,route,O.Relate{source,target}),queue => source => enqueue(queue,route,O.Unrelate{source})} 14 def hierarchy(~S:Data,~Q:Type,~route:Layout.Route,~enqueue:Q -> Layout.Route -> O.Operation -> Q) -> HierarchyCommands: 15 HierarchyCommands{commands(~S,~Q,~route,~enqueue),queue => parent => children => enqueue(queue,route,O.Reorder{parent,children})} 16 def relate_field(~S:Data,~Q:Type,cap:Commands) -> Q -> W.Handle -> W.Handle -> Q: 17 match cap: 18 case Commands{relate,_}:relate 19 def unrelate_field(~S:Data,~Q:Type,cap:Commands) -> Q -> W.Handle -> Q: 20 match cap: 21 case Commands{_,unrelate}:unrelate 22 def relations_field(~S:Data,~Q:Type,cap:HierarchyCommands) -> Commands: 23 match cap: 24 case HierarchyCommands{relations,_}:relations 25 def reorder_field(~S:Data,~Q:Type,cap:HierarchyCommands) -> Q -> W.Handle -> List<&2,W.Handle> -> Q: 26 match cap: 27 case HierarchyCommands{_,reorder}:reorder