1 import Base 2 import ./dependency_plan.bend as Plan 3 import ./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. 7 def include(id:U32,selected:Bool,rest:List<&2,U32>) -> List<&2,U32>: 8 match selected: 9 case True{}:id <> rest 10 case False{}:rest 11 def node_ids(nodes:List<&2,Plan.Node>,+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)) 15 def from_plan(plan:Plan.Build,syncs:List<&2,U32>) -> List<&2,U32>: 16 match plan: 17 case Plan.Rejected{_}:[] 18 case Plan.Planned{nodes,_}:node_ids(nodes,syncs) 19 def from_built(built:Settings.Built) -> List<&2,U32>: 20 match built: 21 case Settings.Built{plan,syncs}:from_plan(plan,syncs) 22 def 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)) 26 def 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)) 30 def 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)) 33 def 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)) 37 def 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)