execution_schedule.bend
bendvy-ecs-core@0.1.0.3 · 47 lines · 14 definitions
1import Base
2import bendvy-ecs-core@0.1.0.3/dependency_plan.bend as Plan
3import bendvy-ecs-core@0.1.0.3/dependency_executor.bend as Exec
4import bendvy-ecs-core@0.1.0.3/dependency_application.bend as App
5import bendvy-ecs-core@0.1.0.3/execution_deferred_settings.bend as Settings
6import bendvy-ecs-core@0.1.0.3/execution_deferred_schedule.bend as DeferredSchedule
7import bendvy-ecs-core@0.1.0.3/execution_publication_order.bend as Order
8
9type Deferred is Data:
10 Deferred{systems:List<&2,U32>,settings:Settings.Settings,unapplied:List<&2,U32>,compiled:Settings.Built,publication:List<&2,U32>}
11type Scheduled<-Actual:Type> is Type:
12 Scheduled{state:Actual,plan:Plan.Build<String>,bindings:List<&2,App.Binding>,deferred:Deferred}
13type ObservedScheduled<-Actual:Type,-Error:Data,-Out:Data> is Type:
14 ObservedScheduled{scheduled:Scheduled<Actual>,report:App.Report<Error,Out>,boundaries:List<&2,DeferredSchedule.Boundary>}
15def created(~Actual:Type,state:Actual,plan:Plan.Build<String>,bindings:List<&2,App.Binding>,systems:List<&2,U32>,settings:Settings.Settings,unapplied:List<&2,U32>,+compiled:Settings.Built) -> Scheduled<Actual>:
16 Scheduled{state,plan,bindings,Deferred{systems,settings,unapplied,compiled,Order.from_built(compiled)}}
17def create(~Actual:Type,state:Actual,+plan:Plan.Build<String>,bindings:List<&2,App.Binding>,+systems:List<&2,U32>,+settings:Settings.Settings,unapplied:List<&2,U32>) -> Scheduled<Actual>:
18 created(~Actual,state,plan,bindings,systems,settings,unapplied,Settings.compile(settings,systems,plan))
19def configure(~Actual:Type,settings:Settings.Settings,scheduled:Scheduled<Actual>) -> Scheduled<Actual>:
20 match scheduled:
21 case Scheduled{state,plan,bindings,Deferred{systems,_,unapplied,_,_}}:create(~Actual,state,plan,bindings,systems,settings,unapplied)
22def set_final_apply(~Actual:Type,finalApply:Bool,scheduled:Scheduled<Actual>) -> Scheduled<Actual>:
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}}
25def trace(on:Bool) -> DeferredSchedule.TraceState:
26 match on:
27 case True{}:DeferredSchedule.On{[]}
28 case False{}:DeferredSchedule.Off{}
29def returned(~Actual:Type,~Error:Data,~Out:Data,plan:Plan.Build<String>,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<Actual,String,Error,Out>) -> ObservedScheduled<Actual,Error,Out>:
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}
34def completed(~Actual:Type,~Error:Data,~Out:Data,completion:Exec.ExecutionResult<Actual,String,Error,Out> -> Exec.ExecutionResult<Actual,String,Error,Out>,plan:Plan.Build<String>,bindings:List<&2,App.Binding>,systems:List<&2,U32>,settings:Settings.Settings,compiled:Settings.Built,publication:List<&2,U32>,result:DeferredSchedule.Observed<Actual,Error,Out>) -> ObservedScheduled<Actual,Error,Out>:
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))
37def run_built(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition<Error>,~dispatch:Actual -> U32 -> Actual & Exec.Invocation<Error,Out>,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult<Actual,String,Error,Out> -> Exec.ExecutionResult<Actual,String,Error,Out>,on:Bool,plan:Plan.Build<String>,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<Actual,Error,Out>:
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))
40def run_observed_with_completion(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition<Error>,~dispatch:Actual -> U32 -> Actual & Exec.Invocation<Error,Out>,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult<Actual,String,Error,Out> -> Exec.ExecutionResult<Actual,String,Error,Out>,on:Bool,scheduled:Scheduled<Actual>) -> ObservedScheduled<Actual,Error,Out>:
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)
43def unobserved(~Actual:Type,~Error:Data,~Out:Data,value:ObservedScheduled<Actual,Error,Out>) -> Scheduled<Actual> & App.Report<Error,Out>:
44 match value:
45 case ObservedScheduled{scheduled,report,_}:(scheduled,report)
46def run_with_completion(~Actual:Type,~Error:Data,~Out:Data,~condition:Actual -> U32 -> Actual & Exec.Condition<Error>,~dispatch:Actual -> U32 -> Actual & Exec.Invocation<Error,Out>,~handler:Actual -> Error -> Actual & Exec.Handling,~apply:List<&2,U32> -> Actual -> Actual & List<&2,U32>,completion:Exec.ExecutionResult<Actual,String,Error,Out> -> Exec.ExecutionResult<Actual,String,Error,Out>,scheduled:Scheduled<Actual>) -> Scheduled<Actual> & App.Report<Error,Out>:
47 unobserved(~Actual,~Error,~Out,run_observed_with_completion(~Actual,~Error,~Out,~condition,~dispatch,~handler,~apply,completion,False{},scheduled))