execution_publication_order.bend

bendvy-ecs-core@0.1.0.3 · 38 lines · 9 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/dependency_plan.bend as Plan
3import bendvy-ecs-core@0.1.0.3/execution_deferred_settings.bend as Settings
4
5# Only actual system IDs enter the retained publication order. Synthetic sync
6# nodes are execution boundaries, never registered command owners.
7def include(id:U32,selected:Bool,rest:List<&2,U32>) -> List<&2,U32>:
8  match selected:
9    case True{}:id <> rest
10    case False{}:rest
11def node_ids(nodes:List<&2,Plan.Node<String>>,+syncs:List<&2,U32>) -> List<&2,U32>:
12  match nodes:
13    case []:[]
14    case Plan.Node{+id,_} <> rest:include(id,Bool.not(Settings.member(id,syncs)),node_ids(rest,syncs))
15def from_plan(plan:Plan.Build<String>,syncs:List<&2,U32>) -> List<&2,U32>:
16  match plan:
17    case Plan.Rejected{_}:[]
18    case Plan.Planned{nodes,_}:node_ids(nodes,syncs)
19def from_built(built:Settings.Built) -> List<&2,U32>:
20  match built:
21    case Settings.Built{plan,syncs}:from_plan(plan,syncs)
22def selected(order:List<&2,U32>,+ids:List<&2,U32>) -> List<&2,U32>:
23  match order:
24    case []:[]
25    case +id <> rest:include(id,Settings.member(id,ids),selected(rest,ids))
26def unknown(+order:List<&2,U32>,ids:List<&2,U32>) -> List<&2,U32>:
27  match ids:
28    case []:[]
29    case +id <> rest:include(id,Bool.not(Settings.member(id,order)),unknown(order,rest))
30def returned(~Actual:Type,order:List<&2,U32>,unknown:List<&2,U32>,result:Actual & List<&2,U32>) -> Actual & List<&2,U32>:
31  match result:
32    case (state,remaining):(state,List.append(&2,U32,selected(order,remaining),unknown))
33def apply_selected(~Actual:Type,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,order:List<&2,U32>,unknown:List<&2,U32>,ids:List<&2,U32>,state:Actual) -> Actual & List<&2,U32>:
34  match ids:
35    case []:(state,unknown)
36    case id <> rest:returned(~Actual,order,unknown,apply(id <> rest,state))
37def apply(~Actual:Type,~publish:List<&2,U32> -> Actual -> Actual & List<&2,U32>,+order:List<&2,U32>,+ids:List<&2,U32>,state:Actual) -> Actual & List<&2,U32>:
38  apply_selected(~Actual,~publish,order,unknown(order,ids),selected(order,ids),state)