execution_machine_stream.bend
bendvy-ecs-core@0.1.0.3 · 44 lines · 14 definitions
1import Base
2import bendvy-ecs-core@0.1.0.3/machine.bend as M
3import bendvy-ecs-core@0.1.0.3/machine_stream_queue.bend as Queue
4import bendvy-ecs-core@0.1.0.3/execution_stream_channel.bend as Channel
5import bendvy-ecs-core@0.1.0.3/execution_composer_layout.bend as Layout
6import bendvy-ecs-core@0.1.0.3/change_tick.bend as Tick
7
8
9
10type Store<-V:Data> is Data:
11 Store{queue:Queue.Queue<M.Transition<V>>,olderThrough:Nat,maintenance:Maybe<&2,Tick.Tick>}
12type Reader<-S:Data,-K:Data,-V:Data,-origin:Layout.Layout,-route:Layout.Route> is Type:
13 Reader{namespace:U32,id:U32,cursor:Nat}
14type Reading<-S:Data,-K:Data,-V:Data,-origin:Layout.Layout,-route:Layout.Route> is Type:
15 Read{reader:Reader<S,K,V,origin,route>,events:List<&2,M.Transition<V>>,missed:Nat,tick:Tick.Tick}
16 Refused{reader:Reader<S,K,V,origin,route>}
17def channel(~V:Data,store:Store<V>) -> Channel.Store<M.Transition<V>>:
18 match store:
19 case Store{queue,olderThrough,maintenance}:Channel.Store{queue,olderThrough,maintenance}
20def stored(~V:Data,store:Channel.Store<M.Transition<V>>) -> Store<V>:
21 match store:
22 case Channel.Store{queue,olderThrough,maintenance}:Store{queue,olderThrough,maintenance}
23def empty(~V:Data) -> Store<V>:stored(~V,Channel.empty(~M.Transition<V>))
24def publish(~V:Data,store:Store<V>,sequence:Nat,event:M.Transition<V>) -> Store<V>:
25 stored(~V,Channel.publish(~M.Transition<V>,channel(~V,store),sequence,event))
26def maintained(~V:Data,+sequence:Nat,tick:Tick.Tick,olderThrough:Nat,queue:Queue.Queue<M.Transition<V>>) -> Store<V>:
27 stored(~V,Channel.maintained(~M.Transition<V>,sequence,tick,olderThrough,queue))
28def maintain(~V:Data,sequence:Nat,tick:Tick.Tick,store:Store<V>) -> Store<V>:
29 stored(~V,Channel.maintain(~M.Transition<V>,sequence,tick,channel(~V,store)))
30def missed(~V:Data,queue:Queue.Queue<M.Transition<V>>,cursor:Nat) -> Nat:
31 Channel.missed(~M.Transition<V>,queue,cursor)
32def returned(~S:Data,~K:Data,~V:Data,~origin:Layout.Layout,~route:Layout.Route,reader:Reader<S,K,V,origin,route>,result:Channel.Store<M.Transition<V>> & Channel.Reading<M.Transition<V>>) -> Store<V> & Reading<S,K,V,origin,route>:
33 match reader result:
34 case reader, (store,Channel.Refused{}):(stored(~V,store),Refused{reader})
35 case Reader{namespace,id,_}, (store,Channel.Read{cursor,events,missed,tick}):(stored(~V,store),Read{Reader{namespace,id,cursor},events,missed,tick})
36def reading(~S:Data,~K:Data,~V:Data,~origin:Layout.Layout,~route:Layout.Route,+sequence:Nat,tick:Tick.Tick,reader:Reader<S,K,V,origin,route>,store:Store<V>) -> Store<V> & Reading<S,K,V,origin,route>:
37 match reader:
38 case Reader{namespace,id,+cursor}:returned(~S,~K,~V,~origin,~route,Reader{namespace,id,cursor},Channel.reading(~M.Transition<V>,sequence,tick,cursor,channel(~V,store)))
39def checked(~S:Data,~K:Data,~V:Data,~origin:Layout.Layout,~route:Layout.Route,allowed:Bool,sequence:Nat,tick:Tick.Tick,reader:Reader<S,K,V,origin,route>,store:Store<V>) -> Store<V> & Reading<S,K,V,origin,route>:
40 match reader:
41 case Reader{namespace,id,+cursor}:returned(~S,~K,~V,~origin,~route,Reader{namespace,id,cursor},Channel.checked(~M.Transition<V>,allowed,sequence,tick,cursor,channel(~V,store)))
42def read(~S:Data,~K:Data,~V:Data,~origin:Layout.Layout,~route:Layout.Route,namespace:Maybe<&2,U32>,sequence:Nat,tick:Tick.Tick,reader:Reader<S,K,V,origin,route>,store:Store<V>) -> Store<V> & Reading<S,K,V,origin,route>:
43 match reader:
44 case Reader{+actual,id,+cursor}:returned(~S,~K,~V,~origin,~route,Reader{actual,id,cursor},Channel.read(~M.Transition<V>,namespace,actual,sequence,tick,cursor,channel(~V,store)))