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
6
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)