1 import Base 2 import ./relation_types.bend as T 3 import ./execution_relation_failure_message.bend as Failure 4 import ./execution_stream_channel.bend as Channel 5 import ./execution_composer_layout.bend as Layout 6 import ./change_tick.bend as Tick 7 8 type Reader<-S:Data,-descriptor:T.Descriptor,-origin:Layout.Layout,-route:Layout.Route> is Type: 9 Reader{namespace:U32,id:U32,cursor:Nat} 10 type Reading<-S:Data,-descriptor:T.Descriptor,-origin:Layout.Layout,-route:Layout.Route> is Type: 11 Read{reader:Reader,messages:List<&2,Failure.Message>,missed:Nat,tick:Tick.Tick} 12 Refused{reader:Reader} 13 def returned(~S:Data,~descriptor:T.Descriptor,~origin:Layout.Layout,~route:Layout.Route,reader:Reader,result:Channel.Store> & Channel.Reading>) -> Channel.Store> & Reading: 14 match reader result: 15 case reader, (store,Channel.Refused{}):(store,Refused{reader}) 16 case Reader{namespace,id,_}, (store,Channel.Read{cursor,messages,missed,tick}):(store,Read{Reader{namespace,id,cursor},messages,missed,tick}) 17 def read(~S:Data,~descriptor:T.Descriptor,~origin:Layout.Layout,~route:Layout.Route,namespace:U32,sequence:Nat,tick:Tick.Tick,reader:Reader,channel:Channel.Store>) -> Channel.Store> & Reading: 18 match reader: 19 case Reader{+actual,id,+cursor}:returned(~S,~descriptor,~origin,~route,Reader{actual,id,cursor},Channel.read(~Failure.Message,Some{namespace},actual,sequence,tick,cursor,channel))