1 import Base 2 import ./change_tick.bend as Tick 3 import ./recognized_query_declaration.bend as N 4 import ./internal/compact_operational_frame.bend as F 5 import ./ordinary_query_declaration.bend as Decl 6 import ./ordinary_system.bend as Ordinary 7 import ./compose.bend as Q 8 import ./transaction.bend as T 9 import ./world.bend as W 10 import ./system.bend as Sys 11 import ./capabilities.bend as Cap 12 13 # Registry ownership and final transaction semantics remain ordinary. The closed 14 # recognized carrier supplies operations for this concrete, smaller owner. 15 def target(~S:Data,~Store:Type,~R:Type,~E:Data,handle:W.Handle,frame:F.Frame) -> F.Frame: 16 match frame: 17 case F.Frame{namespace,allocator,store,_,_,cursor,shell}:F.Frame{namespace,allocator,store,handle,None{},cursor,shell} 18 def row_completed(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,frame:F.Frame,value:Out,status:T.Outcome>) -> F.Frame & Q.RowResult: 19 match status: 20 case T.Success{}:(frame,Q.Passed{value}) 21 case T.Failure{error}:(frame,Q.Failed{error}) 22 def body_returned(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,observed:F.Frame & (T.Outcome & Out)) -> F.Frame & Q.RowResult: 23 match observed: 24 case (F.Frame{namespace,allocator,store,handle,+error,cursor,shell},(user,value)):row_completed(~S,~Store,~R,~E,~U,~Out,F.Frame{namespace,allocator,store,handle,error,cursor,shell},value,Q.outcome(~U,error,user)) 25 def selected(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),args:A,observed:F.Frame & Bool) -> F.Frame & Q.RowResult: 26 match observed: 27 case (frame,False{}):(frame,Q.Skipped{}) 28 case (frame,True{}):body_returned(~S,~Store,~R,~E,~U,~Out,Cap.invoke(~Ops,~A,~(T.Outcome & Out),~body,~F.Frame,~N.caps(~S,~Store,~R,~E,~Ops,query),args,frame)) 29 def run_handles(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),handles:List<&2,W.Handle>,+args:A,values:List<&2,Out>,observed:F.Frame & Q.RowResult) -> F.Frame & (T.Outcome> & List<&2,Out>): 30 match handles observed: 31 case _ Tuple{frame,Q.Failed{error}}:(frame,(T.Failure{error},List.reverse(&2,Out,values))) 32 case Nil{} Tuple{frame,Q.Skipped{}}:(frame,(T.Success{},List.reverse(&2,Out,values))) 33 case Nil{} Tuple{frame,Q.Passed{value}}:(frame,(T.Success{},List.reverse(&2,Out,value <> values))) 34 case Con{handle,rest} Tuple{frame,Q.Skipped{}}:run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,values,selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(target(~S,~Store,~R,~E,handle,frame)))) 35 case Con{handle,rest} Tuple{frame,Q.Passed{value}}:run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,value <> values,selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(target(~S,~Store,~R,~E,handle,frame)))) 36 def finish_frame(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,result:T.Outcome> & List<&2,Out>,frame:Q.Frame) -> Q.Executed,Q.Error,Out>: 37 match frame: 38 case Q.Frame{tx,_,_,_}:Q.finished(~S,~Store,~R,~E,~U,~Out,(tx,result)) 39 def finished(~S:Data,~Store:Type,~R:Type,~E:Data,~U:Data,~Out:Data,observed:F.Frame & (T.Outcome> & List<&2,Out>)) -> Q.Executed,Q.Error,Out>: 40 match observed: 41 case (frame,result):finish_frame(~S,~Store,~R,~E,~U,~Out,result,F.restore(~S,~Store,~R,~E,frame)) 42 def reserved(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),+args:A,cursor:Maybe<&2,Tick.Tick>,observed:W.World & List<&2,W.Handle>) -> Q.Executed,Q.Error,Out>: 43 match observed: 44 case (world,[]):Q.finished(~S,~Store,~R,~E,~U,~Out,(T.begin(~W.World,~E,world),(T.Success{},[]))) 45 case (world,+handle <> rest):finished(~S,~Store,~R,~E,~U,~Out,run_handles(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,rest,args,[],selected(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,N.selector(~S,~Store,~R,~E,~Ops,query)(F.extract(~S,~Store,~R,~E,Q.Frame{T.begin(~W.World,~E,world),handle,None{},cursor}))))) 46 def runner(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),world:W.World,args:A & Maybe<&2,Tick.Tick>) -> Sys.Outcome,Q.Error,List<&2,Out>>: 47 match args: 48 case (args,cursor):Ordinary.completed(~S,~Store,~R,~E,~U,~Out,reserved(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,args,cursor,W.handles(~S,~Store,~R,~E,world))) 49 def registered(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),slot:String,clauses:List<&2,Decl.Clause>,result:Sys.RegistrationResult,Q.Error,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>) -> Ordinary.Defined,Sys.Registry,Q.Error,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>>: 50 match result: 51 case Sys.RegistrationFailed{world}:Ordinary.Rejected{world} 52 case Sys.Registered{world,registry}:Ordinary.Defined{world,Ordinary.Owner{registry,slot,clauses}} 53 def define(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:N.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> A -> H -> H & (T.Outcome & Out),world:W.World,name:String,slot:String) -> Ordinary.Defined,Sys.Registry,Q.Error,List<&2,Out>,runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body)>>: 54 registered(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body,slot,Decl.clauses(~S,~Q.Frame,~Ops(Q.Frame),N.ordinary(~S,~Store,~R,~E,~Ops,query)),Sys.register(~S,~Store,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Q.Error,~List<&2,Out>,~runner(~S,~Store,~R,~E,~Ops,~A,~U,~Out,~query,~body),world,name,Ordinary.access(~S,Decl.clauses(~S,~Q.Frame,~Ops(Q.Frame),N.ordinary(~S,~Store,~R,~E,~Ops,query)))))