internal/relation_failures/readings.bend
bendvy-ecs-core@0.1.0.1 · 31 lines · 0 definitions
1import Base
2import queue.bend as Q
3import domains.bend as D
4import bendvy-ecs-core@0.1.0.1/event_runtime.bend as Ev
5
6type KeyReading<S: Data,E: Data> is Data:
7 KeyReading{key: D.DescriptorKey<S>,values: List<&2,E>,lagged: Bool}
8
9def queue_reading(~S: Data,~E: Data,key: D.DescriptorKey<S>,queue: Q.Queue<E>,position: Ev.Position) -> KeyReading<S,E>:
10 match queue position:
11 case Q.Queue{+front,+back,+size,+dropped} Ev.Position{_,+cursor,+registered}: KeyReading{key,Q.read(~E,Q.Queue{front,back,size,dropped},cursor),Nat.is_lt(Nat.max(cursor,registered),dropped)}
12
13def select(~S: Data,~E: Data,same: Bool,key: D.DescriptorKey<S>,queue: Q.Queue<E>,position: Ev.Position,ih: Unit -> KeyReading<S,E>) -> KeyReading<S,E>:
14 match same:
15 case True{}: queue_reading(~S,~E,key,queue,position)
16 case False{}: ih(Unit{})
17
18def one(~S: Data,~E: Data,domains: List<&2,D.Domain<S,E>>,+wanted: D.DescriptorKey<S>,+position: Ev.Position) -> KeyReading<S,E>:
19 match domains:
20 case []: KeyReading{wanted,[],False{}}
21 case D.Domain{+key,queue,_} <> rest: select(~S,~E,D.key_equal(~S,key,wanted),key,queue,position,_ => one(~S,~E,rest,wanted,position))
22
23def all(~S: Data,~E: Data,keys: List<&2,D.DescriptorKey<S>>,+domains: List<&2,D.Domain<S,E>>,+position: Ev.Position) -> List<&2,KeyReading<S,E>>:
24 match keys:
25 case []: []
26 case key <> rest: one(~S,~E,domains,key,position) <> all(~S,~E,rest,domains,position)
27
28def activate(~S: Data,~E: Data,keys: List<&2,D.DescriptorKey<S>>,domains: List<&2,D.Domain<S,E>>,+id: U32) -> List<&2,D.Domain<S,E>>:
29 match keys:
30 case []: domains
31 case key <> rest: activate(~S,~E,rest,D.activate_one(~S,~E,domains,key,id),id)