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