execution_system.bend
bendvy-ecs-core@0.1.0.3 · 84 lines · 23 definitions
1import Base
2import bendvy-ecs-core@0.1.0.3/execution_effects.bend as E
3import bendvy-ecs-core@0.1.0.3/execution_state_effect.bend as StateEffect
4import bendvy-ecs-core@0.1.0.3/world.bend as W
5import bendvy-ecs-core@0.1.0.3/change_tick.bend as Tick
6import bendvy-ecs-core@0.1.0.3/execution_state.bend as State
7import bendvy-ecs-core@0.1.0.3/execution_declaration.bend as D
8import bendvy-ecs-core@0.1.0.3/execution_builder.bend as Build
9import bendvy-ecs-core@0.1.0.3/execution_reservation_authority.bend as Effect
10import bendvy-ecs-core@0.1.0.3/execution_reservation_authority.bend as RuntimePermit
11
12type Completion<Error:Data,Out:Data> is Data:
13 Success{output:Out}
14 BodyError{error:Error,output:Out}
15def Body(~S:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data) -> Type:
16 @-Permit:Data -> @-F:(Type -> Type) -> @-effects:E.Effects<F> -> @-H:Type -> @-caps:Ops(Permit,F,H) -> H -> Local -> F(H & (Local & Completion<Error,Out>))
17type Owner<-S:Data,-WC:Type,-C:Type,-R:Type,-E:Data,-Ops:Data -> (Type -> Type) -> Type -> Type,-Local:Type,-Error:Data,-Out:Data,-declaration:Build.FrameworkProgram(~S,~WC,~C,~R,~Ops),-body:Body(~S,~Ops,~Local,~Error,~Out)> is Type:
18 Owner{namespace:U32,id:U32,name:String,access:List<&2,String>,cursor:Maybe<&2,Tick.Tick>,local:Local}
19type Defined<-World:Type,-System:Type,-Local:Type> is Type:
20 Defined{world:World,system:System}
21 DefinitionRefused{world:World,local:Local}
22type RunResult<-World:Type,-System:Type,Error:Data,Out:Data> is Type:
23 Executed{world:World,system:System,completion:Completion<Error,Out>}
24 Refused{world:World,system:System}
25
26def registered(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),namespace:U32,name:String,access:List<&2,String>,local:Local,result:W.World<S,C,R,E> & W.Registration) -> Defined<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Local>:
27 match result:
28 case (world,W.RegistrationRejected{_}):DefinitionRefused{world,local}
29 case (world,W.Registered{id}):Defined{world,Owner{namespace,id,name,access,None{},local}}
30def named_compilation(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),+name:String,local:Local,world:W.World<S,C,R,E>,namespace:U32,compilation:D.Compilation<S,C,C,R,Ops>) -> Defined<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Local>:
31 match compilation:
32 case D.Unsupported{_,_,_}:DefinitionRefused{world,local}
33 case D.Supported{D.Declaration{_,access},_}:
34 +keys = D.keys(access)
35 registered(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,namespace,name,keys,local,W.register(~S,~C,~R,~E,world,name,keys))
36def named(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),+name:String,local:Local,result:W.World<S,C,R,E> & U32) -> Defined<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Local>:
37 match result:
38 case (world,namespace):named_compilation(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,name,local,world,namespace,Build.compile_framework(~S,~C,~C,~R,~Ops,~declaration))
39
40def define_framework(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),world:W.World<S,C,R,E>,name:String,local:Local) -> Defined<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Local>:
41 named(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,name,local,W.namespace(~S,~C,~R,~E,world))
42def returned(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),admin:State.Administration<S,C,R,E>,namespace:U32,id:U32,name:String,access:List<&2,String>,+tick:Tick.Tick,result:State.Invocation<S> & (State.Scope<S,C,R> & (Local & Completion<Error,Out>))) -> RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
43 match result:
44 case (invocation,(scope,(local,completion))):Executed{W.leave_run(~S,~C,~R,~E,State.reassemble(~S,~C,~R,~E,admin,invocation,scope)),Owner{namespace,id,name,access,Some{tick},local},completion}
45
46def verified_registration(~S:Data,~C:Type,~R:Type,~E:Data,same:Bool,result:W.World<S,C,R,E> & Bool) -> W.World<S,C,R,E> & Bool:
47 match result:
48 case (world,registered):(world,Bool.and(same,registered))
49def trusted_run_scope(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,namespace:U32,+id:U32,name:String,access:List<&2,String>,prior:Maybe<&2,Tick.Tick>,local:Local,+tick:Tick.Tick,separated:State.Administration<S,C,R,E> & (State.Invocation<S> & State.Scope<S,C,R>)) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
50 match separated:
51 case (admin,(invocation,scope)):(compilation,returned(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,admin,namespace,id,name,access,tick,body(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),StateEffect.dictionary(~State.Invocation<S>),State.Scope<S,C,R>,compiledCaps,State.window(~S,~C,~R,scope,prior),local)(State.admit(~S,id,grant,invocation))))
52def trusted_run_entered(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,namespace:U32,id:U32,name:String,access:List<&2,String>,prior:Maybe<&2,Tick.Tick>,local:Local,entered:W.World<S,C,R,E> & Tick.Tick) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
53 match entered:
54 case (world,+tick):trusted_run_scope(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,grant,compilation,namespace,id,name,access,prior,local,tick,State.separate(~S,~C,~R,~E,world,tick))
55def trusted_run_verified(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,verified:W.World<S,C,R,E> & Bool) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
56 match system verified:
57 case system Tuple{world,False{}}:(compilation,Refused{world,system})
58 case Owner{namespace,id,name,access,prior,local} Tuple{world,True{}}:trusted_run_entered(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,grant,compilation,namespace,id,name,access,prior,local,W.enter_run(~S,~C,~R,~E,world))
59def trusted_run_namespace(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,observed:W.World<S,C,R,E> & U32) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
60 match system observed:
61 case Owner{+namespace,+id,+name,+access,prior,local} Tuple{world,actual}:trusted_run_verified(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,grant,compilation,Owner{namespace,id,name,access,prior,local},verified_registration(~S,~C,~R,~E,U32.is_eq(namespace,actual),W.registration_matches(~S,~C,~R,~E,world,id,name,access)))
62def trusted_run_retained_compilation(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,world:W.World<S,C,R,E>) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
63 match compilation:
64 case D.Unsupported{caps,requirements,recipes}:(D.Unsupported{caps,requirements,recipes},Refused{world,system})
65 case D.Supported{actualDeclaration,recipes}:trusted_run_namespace(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,grant,D.Supported{actualDeclaration,recipes},system,W.namespace(~S,~C,~R,~E,world))
66def run_retained_compilation(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),compilation:D.Compilation<S,C,C,R,Ops>,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,world:W.World<S,C,R,E>) -> D.Compilation<S,C,C,R,Ops> & RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
67 trusted_run_retained_compilation(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,RuntimePermit.NoStructural{},compilation,system,world)
68
69def run_result(-Compilation:Type,-Result:Type,result:Compilation & Result) -> Result:
70 match result:
71 case (_,result):result
72def trusted_run_compilation(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compiledCaps:Ops(Effect.Granted,StateEffect.Transition(~State.Invocation<S>),State.Scope<S,C,R>),grant:RuntimePermit.Grant,compilation:D.Compilation<S,C,C,R,Ops>,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,world:W.World<S,C,R,E>) -> RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
73 run_result(D.Compilation<S,C,C,R,Ops>,RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>,trusted_run_retained_compilation(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~compiledCaps,grant,compilation,system,world))
74def trusted_run_constructed(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),~compilation:D.Compilation<S,C,C,R,Ops>,grant:RuntimePermit.Grant,system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,world:W.World<S,C,R,E>) -> RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
75 trusted_run_compilation(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~D.trusted_construction_caps(~S,~C,~C,~R,~Ops,compilation),grant,compilation,system,world)
76def run(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),system:Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,world:W.World<S,C,R,E>) -> RunResult<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,declaration,body>,Error,Out>:
77 trusted_run_constructed(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~declaration,~body,~Build.compile_framework(~S,~C,~C,~R,~Ops,~declaration),RuntimePermit.NoStructural{},system,world)
78
79def metadata(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.FrameworkProgram(~S,~WC,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),system:Owner<S,WC,C,R,E,Ops,Local,Error,Out,declaration,body>) -> Owner<S,WC,C,R,E,Ops,Local,Error,Out,declaration,body> & W.RegistrationMeta:
80 match system:
81 case Owner{+namespace,+id,+name,+access,cursor,local}:(Owner{namespace,id,name,access,cursor,local},W.RegistrationMeta{id,name,access})
82
83def define(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Data -> (Type -> Type) -> Type -> Type,~Local:Type,~Error:Data,~Out:Data,~declaration:Build.Program(~S,~C,~C,~R,~Ops),~body:Body(~S,~Ops,~Local,~Error,~Out),world:W.World<S,C,R,E>,name:String,local:Local) -> Defined<W.World<S,C,R,E>,Owner<S,C,C,R,E,Ops,Local,Error,Out,Build.framework_program(~S,~C,~C,~R,~Ops,~declaration),body>,Local>:
84 define_framework(~S,~C,~R,~E,~Ops,~Local,~Error,~Out,~Build.framework_program(~S,~C,~C,~R,~Ops,~declaration),~body,world,name,local)