1 import Base 2 import ./dependency_plan.bend as Plan 3 import ./dependency_executor.bend as Exec 4 import ./dependency_application.bend as App 5 import ./execution_deferred_settings.bend as Settings 6 import ./execution_deferred_schedule.bend as DeferredSchedule 7 import ./execution_publication_order.bend as Order 8 9 type Deferred is Data: 10 Deferred{systems:List<&2,U32>,settings:Settings.Settings,unapplied:List<&2,U32>,compiled:Settings.Built,publication:List<&2,U32>} 11 type Scheduled<-Actual:Type> is Type: 12 Scheduled{state:Actual,plan:Plan.Build,bindings:List<&2,App.Binding>,deferred:Deferred} 13 type ObservedScheduled<-Actual:Type,-Error:Data,-Out:Data> is Type: 14 ObservedScheduled{scheduled:Scheduled,report:App.Report,boundaries:List<&2,DeferredSchedule.Boundary>} 15 def created(~Actual:Type,state:Actual,plan:Plan.Build,bindings:List<&2,App.Binding>,systems:List<&2,U32>,settings:Settings.Settings,unapplied:List<&2,U32>,+compiled:Settings.Built) -> Scheduled: 16 Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,Order.from_built(compiled)}} 17 def create(~Actual:Type,state:Actual,+plan:Plan.Build,bindings:List<&2,App.Binding>,+systems:List<&2,U32>,+settings:Settings.Settings,unapplied:List<&2,U32>) -> Scheduled: 18 created(~Actual,state,plan,bindings,systems,settings,unapplied,Settings.compile(settings,systems,plan)) 19 def configure(~Actual:Type,settings:Settings.Settings,scheduled:Scheduled) -> Scheduled: 20 match scheduled: 21 case Scheduled{state,plan,bindings,Deferred{systems,_,unapplied,_,_}}:create(~Actual,state,plan,bindings,systems,settings,unapplied) 22 def set_final_apply(~Actual:Type,finalApply:Bool,scheduled:Scheduled) -> Scheduled: 23 match scheduled: 24 case Scheduled{state,plan,bindings,Deferred{systems,Settings.Settings{automatic,_,ignored,explicit},unapplied,compiled,publication}}:Scheduled{state,plan,bindings,Deferred{systems,Settings.Settings{automatic,finalApply,ignored,explicit},unapplied,compiled,publication}} 25 def trace(on:Bool) -> DeferredSchedule.TraceState: 26 match on: 27 case True{}:DeferredSchedule.On{[]} 28 case False{}:DeferredSchedule.Off{} 29 def returned(~Actual:Type,~Error:Data,~Out:Data,plan:Plan.Build,bindings:List<&2,App.Binding>,systems:List<&2,U32>,settings:Settings.Settings,compiled:Settings.Built,publication:List<&2,U32>,unapplied:List<&2,U32>,boundaries:List<&2,DeferredSchedule.Boundary>,result:Exec.ExecutionResult) -> ObservedScheduled: 30 match result: 31 case Exec.Finished{state,events}:ObservedScheduled{Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,publication}},App.Finished{events},boundaries} 32 case Exec.Stopped{state,error,events}:ObservedScheduled{Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,publication}},App.Stopped{error,events},boundaries} 33 case Exec.Invalid{state,reason}:ObservedScheduled{Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,publication}},App.Invalid{reason},boundaries} 34 def completed(~Actual:Type,~Error:Data,~Out:Data,completion:Exec.ExecutionResult -> Exec.ExecutionResult,plan:Plan.Build,bindings:List<&2,App.Binding>,systems:List<&2,U32>,settings:Settings.Settings,compiled:Settings.Built,publication:List<&2,U32>,result:DeferredSchedule.Observed) -> ObservedScheduled: 35 match result: 36 case DeferredSchedule.Observed{DeferredSchedule.Outcome{result,unapplied},boundaries}:returned(~Actual,~Error,~Out,plan,bindings,systems,settings,compiled,publication,unapplied,boundaries,completion(result)) 37 def run_built(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition,~dispatch:Actual -> U32 -> Actual & Exec.Invocation,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult -> Exec.ExecutionResult,on:Bool,plan:Plan.Build,bindings:List<&2,App.Binding>,systems:List<&2,U32>,+settings:Settings.Settings,state:Actual,unapplied:List<&2,U32>,+publication:List<&2,U32>,built:Settings.Built) -> ObservedScheduled: 38 match built: 39 case Settings.Built{+compiled,+syncs}:completed(~Actual,~Error,~Out,completion,plan,bindings,systems,settings,Settings.Built{compiled,syncs},publication,DeferredSchedule.run_ordered(~Actual,~Error,~Out,~condition,~dispatch,~handler,~apply,trace(on),settings,syncs,publication,compiled,state,unapplied)) 40 def run_observed_with_completion(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition,~dispatch:Actual -> U32 -> Actual & Exec.Invocation,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult -> Exec.ExecutionResult,on:Bool,scheduled:Scheduled) -> ObservedScheduled: 41 match scheduled: 42 case Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,publication}}:run_built(~Actual,~Error,~Out,~condition,~dispatch,~handler,~apply,completion,on,plan,bindings,systems,settings,state,unapplied,publication,compiled) 43 def unobserved(~Actual:Type,~Error:Data,~Out:Data,value:ObservedScheduled) -> Scheduled & App.Report: 44 match value: 45 case ObservedScheduled{scheduled,report,_}:(scheduled,report) 46 def run_with_completion(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition,~dispatch:Actual -> U32 -> Actual & Exec.Invocation,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult -> Exec.ExecutionResult,scheduled:Scheduled) -> Scheduled & App.Report: 47 unobserved(~Actual,~Error,~Out,run_observed_with_completion(~Actual,~Error,~Out,~condition,~dispatch,~handler,~apply,completion,False{},scheduled))