ordinary_machine_condition.bend

bendvy-ecs-core@0.1.0.0 · 47 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.0/ordinary_machine_initialization.bend as Init
3import bendvy-ecs-core@0.1.0.0/ordinary_machine_declaration.bend as OD
4import bendvy-ecs-core@0.1.0.0/machine.bend as M
5import bendvy-ecs-core@0.1.0.0/world.bend as W
6import bendvy-ecs-core@0.1.0.0/system.bend as Sys
7
8# Each ordinary condition is an actual registered system plus its own revision.
9# The revision is separate from the Registry's real World-clock cursor.
10def present(~S:Data,~K:Data,~V:Data,slot:M.Slot<S,K,V>) -> Bool:
11  match slot:
12    case M.Missing{}:False{}
13    case _:True{}
14def revision_taken(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,pair:R & Init.State<S,K,V>) -> R & (Nat & Bool):
15  match pair:
16    case (resource,Init.State{+slot,stream,+revision}):(put(resource,Init.State{slot,stream,revision}),(revision,present(~S,~K,~V,slot)))
17def observed(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,prior:Nat,pair:W.World<S,C,R,E> & (Nat & Bool)) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Nat & Bool>:
18  match pair:
19    case (world,(+current,present)):Sys.Succeeded{world,(current,Bool.and(present,Nat.is_lt(prior,current)))}
20def runner(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,world:W.World<S,C,R,E>,prior:Nat) -> Sys.Outcome<W.World<S,C,R,E>,Unit,Nat & Bool>:
21  observed(~S,~K,~V,~R,~take,~put,~C,~E,prior,W.observe_resource(~S,~C,~R,~E,~(Nat & Bool),~(resource => revision_taken(~S,~K,~V,~R,~take,~put,~C,~E,take(resource))),world))
22type Instance<S:Data,K:Data,V:Data,C:Type,R:Type,E:Data,-take:R -> R & Init.State<S,K,V>,-put:R -> Init.State<S,K,V> -> R> is Type:
23  Instance{registry:Sys.Registry<S,C,R,E,Nat,Unit,Nat & Bool,runner(~S,~K,~V,~R,~take,~put,~C,~E)>,lastRevision:Nat}
24type Definition<S:Data,K:Data,V:Data,C:Type,R:Type,E:Data,-take:R -> R & Init.State<S,K,V>,-put:R -> Init.State<S,K,V> -> R> is Type:
25  Defined{world:W.World<S,C,R,E>,instance:Instance<S,K,V,C,R,E,take,put>}
26  DefinitionRejected{world:W.World<S,C,R,E>}
27def registered(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,result:Sys.RegistrationResult<S,C,R,E,Nat,Unit,Nat & Bool,runner(~S,~K,~V,~R,~take,~put,~C,~E)>) -> Definition<S,K,V,C,R,E,take,put>:
28  match result:
29    case Sys.Registered{world,registry}:Defined{world,Instance{registry,0n}}
30    case Sys.RegistrationFailed{world}:DefinitionRejected{world}
31def define(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,~declaration:OD.Declaration<S,K,V,R,Init.take_slot(~S,~K,~V,~R,~take,~put)>,world:W.World<S,C,R,E>,name:String) -> Definition<S,K,V,C,R,E,take,put>:
32  registered(~S,~K,~V,~R,~take,~put,~C,~E,Sys.register(~S,~C,~R,~E,~Nat,~Unit,~(Nat & Bool),~runner(~S,~K,~V,~R,~take,~put,~C,~E),world,name,["machine." ++ OD.name(~S,~K,~V,~R,~Init.take_slot(~S,~K,~V,~R,~take,~put),declaration) ++ ".changed"]))
33type Observed<S:Data,K:Data,V:Data,C:Type,R:Type,E:Data,-take:R -> R & Init.State<S,K,V>,-put:R -> Init.State<S,K,V> -> R> is Type:
34  Observed{world:W.World<S,C,R,E>,instance:Instance<S,K,V,C,R,E,take,put>,value:Maybe<&2,Bool>}
35  RegistrationRejected{world:W.World<S,C,R,E>,instance:Instance<S,K,V,C,R,E,take,put>}
36def completed(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,prior:Nat,result:Sys.RunResult<S,C,R,E,Nat,Unit,Nat & Bool,runner(~S,~K,~V,~R,~take,~put,~C,~E)>) -> Observed<S,K,V,C,R,E,take,put>:
37  match result:
38    case Sys.Completed{registry,Sys.Succeeded{world,(revision,value)}}:Observed{world,Instance{registry,revision},Some{value}}
39    case Sys.Completed{registry,Sys.Failed{world,_}}:Observed{world,Instance{registry,prior},None{}}
40    case Sys.RegistrationRejected{registry,world,_}:RegistrationRejected{world,Instance{registry,prior}}
41def run(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,instance:Instance<S,K,V,C,R,E,take,put>,world:W.World<S,C,R,E>) -> Observed<S,K,V,C,R,E,take,put>:
42  match instance:
43    case Instance{registry,+prior}:completed(~S,~K,~V,~R,~take,~put,~C,~E,prior,Sys.run(~S,~C,~R,~E,~Nat,~Unit,~(Nat & Bool),~runner(~S,~K,~V,~R,~take,~put,~C,~E),registry,world,prior))
44def run_if(~S:Data,~K:Data,~V:Data,~R:Type,~take:R -> R & Init.State<S,K,V>,~put:R -> Init.State<S,K,V> -> R,~C:Type,~E:Data,enabled:Bool,instance:Instance<S,K,V,C,R,E,take,put>,world:W.World<S,C,R,E>) -> Observed<S,K,V,C,R,E,take,put>:
45  match enabled:
46    case False{}:Observed{world,instance,None{}}
47    case True{}:run(~S,~K,~V,~R,~take,~put,~C,~E,instance,world)