1 import Base 2 import queue.bend as Q 3 import domains.bend as D 4 import ../../event_runtime.bend as Ev 5 6 type KeyReading is Data: 7 KeyReading{key: D.DescriptorKey,values: List<&2,E>,lagged: Bool} 8 9 def queue_reading(~S: Data,~E: Data,key: D.DescriptorKey,queue: Q.Queue,position: Ev.Position) -> KeyReading: 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 13 def select(~S: Data,~E: Data,same: Bool,key: D.DescriptorKey,queue: Q.Queue,position: Ev.Position,ih: Unit -> KeyReading) -> KeyReading: 14 match same: 15 case True{}: queue_reading(~S,~E,key,queue,position) 16 case False{}: ih(Unit{}) 17 18 def one(~S: Data,~E: Data,domains: List<&2,D.Domain>,+wanted: D.DescriptorKey,+position: Ev.Position) -> KeyReading: 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 23 def all(~S: Data,~E: Data,keys: List<&2,D.DescriptorKey>,+domains: List<&2,D.Domain>,+position: Ev.Position) -> List<&2,KeyReading>: 24 match keys: 25 case []: [] 26 case key <> rest: one(~S,~E,domains,key,position) <> all(~S,~E,rest,domains,position) 27 28 def activate(~S: Data,~E: Data,keys: List<&2,D.DescriptorKey>,domains: List<&2,D.Domain>,+id: U32) -> List<&2,D.Domain>: 29 match keys: 30 case []: domains 31 case key <> rest: activate(~S,~E,rest,D.activate_one(~S,~E,domains,key,id),id)