internal/relation_failures/readings.bend

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

1import Base
2import queue.bend as Q
3import domains.bend as D
4import bendvy-ecs-core@0.1.0.0/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)