ordinary_event_declaration.bend
bendvy-ecs-core@0.1.0.4 · 76 lines · 13 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/world.bend as W
3import bendvy-ecs-core@0.1.0.4/system.bend as Sys
4import bendvy-ecs-core@0.1.0.4/event_runtime.bend as Ev
5
6
7
8
9
10
11type Domain<S:Data,E:Data> is Data:
12 Domain{key:String}
13
14
15type Mode is Data:
16 Read{}
17 Write{}
18
19
20type Declaration<S:Data,E:Data> is Data:
21 Declaration{domain:Domain<S,E>,mode:Mode}
22
23
24
25
26def domain(~S:Data,~E:Data,key:String) -> Domain<S,E>:Domain{key}
27
28
29def read(~S:Data,~E:Data,domain:Domain<S,E>) -> Declaration<S,E>:Declaration{domain,Read{}}
30
31
32def write(~S:Data,~E:Data,domain:Domain<S,E>) -> Declaration<S,E>:Declaration{domain,Write{}}
33
34
35def access(~S:Data,~E:Data,declaration:Declaration<S,E>) -> String:
36 match declaration:
37 case Declaration{Domain{key},Read{}}:String.concat([key,":read"])
38 case Declaration{Domain{key},Write{}}:String.concat([key,":write"])
39
40
41
42def reading(~S:Data,~E:Data,~H:Type,~observe:H -> H & Ev.Reading<E>,declaration:Declaration<S,E>) -> Maybe<&2,Ev.ReadAccess<H,E,observe>>:
43 match declaration:
44 case Declaration{_,Read{}}:Some{Ev.ReadAccess{}}
45 case Declaration{_,Write{}}:None{}
46
47
48
49def publishing(~S:Data,~E:Data,~H:Type,~publish:H -> E -> H,declaration:Declaration<S,E>) -> Maybe<&2,Ev.WriteAccess<H,E,publish>>:
50 match declaration:
51 case Declaration{_,Write{}}:Some{Ev.WriteAccess{}}
52 case Declaration{_,Read{}}:None{}
53
54
55
56
57def register_reader(~S:Data,~C:Type,~R:Type,~E:Data,~A:Type,~Error:Data,~O:Type,~runner:W.World<S,C,R,E> -> Ev.Input<E,A> -> Sys.Outcome<W.World<S,C,R,E>,Error,O>,runtime:Ev.Runtime<S,C,R,E>,+declaration:Declaration<S,E>,name:String) -> Ev.Registered<S,C,R,E,A,Error,O,runner>:
58 match declaration:
59 case Declaration{_,Write{}}:Ev.RegisterFailed{runtime}
60 case Declaration{+domain,Read{}}:Ev.register(~S,~C,~R,~E,~A,~Error,~O,~runner,runtime,name,[access(~S,~E,Declaration{domain,Read{}})])
61
62
63
64def register_writer(~S:Data,~C:Type,~R:Type,~E:Data,~A:Type,~Error:Data,~O:Type,~runner:W.World<S,C,R,E> -> A -> Sys.Outcome<W.World<S,C,R,E>,Error,O>,world:W.World<S,C,R,E>,+declaration:Declaration<S,E>,name:String) -> Sys.RegistrationResult<S,C,R,E,A,Error,O,runner>:
65 match declaration:
66 case Declaration{_,Read{}}:Sys.RegistrationFailed{world}
67 case Declaration{+domain,Write{}}:Sys.register(~S,~C,~R,~E,~A,~Error,~O,~runner,world,name,[access(~S,~E,Declaration{domain,Write{}})])
68
69
70
71
72def read_grant(~S:Data,~E:Data,~H:Type,~observe:H -> H & Ev.Reading<E>,_:Domain<S,E>) -> Ev.ReadAccess<H,E,observe>:Ev.ReadAccess{}
73
74
75
76def write_grant(~S:Data,~E:Data,~H:Type,~publish:H -> E -> H,_:Domain<S,E>) -> Ev.WriteAccess<H,E,publish>:Ev.WriteAccess{}