1 import Base 2 import ./world.bend as W 3 import ./event_runtime.bend as Ev 4 import ./event_stream.bend as Leaf 5 import ./event_family_routing.bend as Route 6 import ./ordinary_event_declaration.bend as Event 7 import ./capabilities.bend as Cap 8 9 # Read-only retained leaf values. No operational reader action or World adapter. 10 def selected(~S:Data,~E:Data,allowed:Bool,+stream:Leaf.Stream) -> Leaf.Stream & Maybe<&2,List<&2,E>>: 11 match allowed stream: 12 case False{} stream:(stream,None{}) 13 case True{} Leaf.Stream{domain,+batches,positions,nextReader,frameStart,boundary,capacity,dropped}:(Leaf.Stream{domain,batches,positions,nextReader,frameStart,boundary,capacity,dropped},Some{Ev.values(~E,batches)}) 14 def declared(~S:Data,~E:Data,declaration:Event.Declaration,+stream:Leaf.Stream) -> Leaf.Stream & Maybe<&2,List<&2,E>>: 15 match declaration stream: 16 case Event.Declaration{_,Event.Write{}} stream:(stream,None{}) 17 case Event.Declaration{Event.Domain{expected},Event.Read{}} Leaf.Stream{Event.Domain{+actual},+batches,+positions,+nextReader,+frameStart,+boundary,+capacity,+dropped}:selected(~S,~E,String.eq(expected,actual),Leaf.Stream{Event.Domain{actual},batches,positions,nextReader,frameStart,boundary,capacity,dropped}) 18 def restored(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~take:F -> F & Leaf.Stream,~put:F -> Leaf.Stream -> F,world:W.World,tick:Nat,family:F,returned:Leaf.Stream & Maybe<&2,List<&2,E>>) -> Route.Runtime & Maybe<&2,List<&2,E>>: 19 match returned: 20 case (stream,values):(Route.Runtime{world,put(family,stream),tick},values) 21 def taken(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~take:F -> F & Leaf.Stream,~put:F -> Leaf.Stream -> F,declaration:Event.Declaration,world:W.World,tick:Nat,returned:F & Leaf.Stream) -> Route.Runtime & Maybe<&2,List<&2,E>>: 22 match returned: 23 case (family,stream):restored(~S,~C,~R,~P,~E,~F,~take,~put,world,tick,family,declared(~S,~E,declaration,stream)) 24 def get(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~take:F -> F & Leaf.Stream,~put:F -> Leaf.Stream -> F,declaration:Event.Declaration,owner:Route.Runtime) -> Route.Runtime & Maybe<&2,List<&2,E>>: 25 match owner: 26 case Route.Runtime{world,family,tick}:taken(~S,~C,~R,~P,~E,~F,~take,~put,declaration,world,tick,take(family)) 27 def read(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~take:F -> F & Leaf.Stream,~put:F -> Leaf.Stream -> F,declaration:Event.Declaration) -> Cap.ValueRead,Maybe<&2,List<&2,E>>>: 28 Cap.ValueRead{owner => get(~S,~C,~R,~P,~E,~F,~take,~put,declaration,owner)} 29 def values(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~take:F -> F & Leaf.Stream,~put:F -> Leaf.Stream -> F,declaration:Event.Declaration,owner:Route.Runtime) -> Route.Runtime & Maybe<&2,List<&2,E>>: 30 Cap.value_read_field(~Route.Runtime,~Maybe<&2,List<&2,E>>,read(~S,~C,~R,~P,~E,~F,~take,~put,declaration))(owner)