1 import Base 2 import ./change_tick.bend as Tick 3 import ./world.bend as W 4 import ./system.bend as Sys 5 import ./transaction.bend as T 6 import ./compose.bend as Q 7 import ./capture_query.bend as Fold 8 import ./ordinary_query_declaration.bend as Decl 9 import ./ordinary_system.bend as Ordinary 10 import ./ordinary_owned_event.bend as Pub 11 import ./owned_event_journal.bend as Journal 12 import ./ordinary_owned_event_declaration.bend as Events 13 def plan(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~query:Decl.Declaration,Ops(Q.Frame)>) -> Q.Plan: 14 Q.Plan{Decl.grant(~S,~Q.Frame,~Ops(Q.Frame),query),Decl.selector(~S,~Q.Frame,~Ops(Q.Frame),query)} 15 def row(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out)),~H:Type,~caps:Ops(H),stage:Journal.Stage,Recovery>,args:A,owner:H) -> H & (Journal.Stage,Recovery> & (T.Outcome & Out)): 16 body(H,caps,Journal.Stage,Recovery>,Events.root_grant(~S,~W.World,~Recovery,~EventOps,~builder),args,owner,stage) 17 type Reply is Type: 18 Reply{outcome:T.Outcome,output:Out,recovered:Recovery} 19 def finished(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~U:Data,~Out:Data,outcome:T.Outcome>,values:List<&2,Out>,result:W.World & Recovery) -> Sys.Outcome,Unit,Reply,List<&2,Out>,Recovery>>: 20 match result: 21 case (world,recovered):Sys.Succeeded{world,Reply{outcome,values,recovered}} 22 def executing(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~U:Data,~Out:Data,empty:Unit -> Recovery,result:Fold.Executed,Journal.Stage,Recovery>,Q.Error,Out>) -> Sys.Outcome,Unit,Reply,List<&2,Out>,Recovery>>: 23 match result: 24 case Fold.Executed{world,stage,T.Success{},values}:finished(~S,~C,~R,~E,~Recovery,~U,~Out,T.Success{},values,Journal.finish(~W.World,~Recovery,stage,True{},world,empty(Unit{}))) 25 case Fold.Executed{world,stage,T.Failure{error},_}:finished(~S,~C,~R,~E,~Recovery,~U,~Out,T.Failure{error},[],Journal.finish(~W.World,~Recovery,stage,False{},world,empty(Unit{}))) 26 def runner(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~events:Events.Declaration,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration,Ops(Q.Frame)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out)),world:W.World,input:A & Maybe<&2,Tick.Tick>) -> Sys.Outcome,Unit,Reply,List<&2,Out>,Recovery>>: 27 match input: 28 case (args,cursor):executing(~S,~C,~R,~E,~Recovery,~U,~Out,Events.empty(~S,~W.World,~Recovery,~EventOps,~builder,events),Fold.each_since(~S,~C,~R,~E,~Journal.Stage,Recovery>,~U,~Out,~Ops,~A,~plan(~S,~C,~R,~E,~Ops,~query),~row(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~Ops,~A,~U,~Out,~body),args,cursor,Journal.empty(~W.World,~Recovery),world)) 29 def Registry(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~events:Events.Declaration,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration,Ops(Q.Frame)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out))) -> Type:Sys.Registry,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)> 30 def define(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~events:Events.Declaration,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration,Ops(Q.Frame)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out)),world:W.World,name:String) -> Sys.RegistrationResult,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>: 31 Sys.register(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),world,name,List.append(&2,String,Ordinary.access(~S,Decl.clauses(~S,~Q.Frame,~Ops(Q.Frame),query)),Events.access(~S,~W.World,~Recovery,~EventOps,~builder,events))) 32 # Transport is closed and always succeeds. Semantic failure must not advance the 33 # ordinary query cursor; the returned receipt remains outside Sys.Failed erasure. 34 def run_observed(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~events:Events.Declaration,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration,Ops(Q.Frame)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out)),world:W.World,args:A,observed:Sys.Registry,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)> & Maybe<&2,Tick.Tick>) -> Sys.RunResult,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>: 35 match observed: 36 case (registry,cursor):Sys.run(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),registry,world,(args,cursor)) 37 def run(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~events:Events.Declaration,Recovery,EventOps,builder>,~Ops:Type -> Type,~A:Data,~U:Data,~Out:Data,~query:Decl.Declaration,Ops(Q.Frame)>,~body:@-H:Type -> @-caps:Ops(H) -> @-J:Type -> @-emit:EventOps(J) -> A -> H -> J -> H & (J & (T.Outcome & Out)),registry:Sys.Registry,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>,world:W.World,args:A) -> Sys.RunResult,Unit,Reply,List<&2,Out>,Recovery>,runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body)>: 38 run_observed(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body,world,args,Sys.cursor(~S,~C,~R,~E,~(A & Maybe<&2,Tick.Tick>),~Unit,~Reply,List<&2,Out>,Recovery>,~runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~events,~Ops,~A,~U,~Out,~query,~body),registry))