1 import Base 2 import ./change_tick.bend as Tick 3 import ./machine_handler_context.bend as HandlerContext 4 import ./machine_handler_engine.bend as HandlerEngine 5 import ./machine_handlers.bend as Handlers 6 import ./machine.bend as Machine 7 import ./machine_world.bend as MachineWorld 8 import ./ordinary_machine_declaration.bend as MachineDecl 9 import ./ordinary_owned_event_family_publisher.bend as Publisher 10 import ./ordinary_owned_event_declaration.bend as Events 11 import ./execution_context.bend as Ctx 12 import ./trace_facts.bend as Facts 13 import ./system.bend as Sys 14 import ./world.bend as W 15 import ./ordinary_app_registration_run.bend as Run 16 import ./transaction.bend as T 17 import ./ordinary_resource_field_system.bend as Field 18 import ./ordinary_app_resource_field_declaration.bend as D 19 import ./ordinary_system.bend as Component 20 import ./ordinary_query_observable.bend as O 21 import ./compose.bend as Q 22 import ./inspector.bend as I 23 import ./ordinary_app_registration_fields.bend as Records 24 def outcome(~World:Type,~Error:Data,~Out:Type,trace:Facts.State,result:Sys.Outcome) -> Sys.Outcome,Error,Out>: 25 match result: 26 case Sys.Succeeded{world,output}:Sys.Succeeded{Ctx.Context{world,trace},output} 27 case Sys.Failed{world,error}:Sys.Failed{Ctx.Context{world,trace},error} 28 def returned(~S:Data,~World:Type,~Args:Type,~Error:Data,~Out:Type,~Token:Type,result:Run.TransportResult & Facts.State) -> Run.TransportResult,Args,Error,Out,Token>: 29 match result: 30 case (Run.Completed{token,fields,value},trace):Run.Completed{token,fields,outcome(~World,~Error,~Out,trace,value)} 31 case (Run.RegistrationRejected{token,fields,world,args},trace):Run.RegistrationRejected{token,fields,Ctx.Context{world,trace},args} 32 33 # Fact-producing runner and normal Registry share the same declaration/body. 34 def resource_transport(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~Value:Data,~declaration:D.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),token:Records.Token>,fields:Records.Fields,trace:Facts.State,world:W.World,args:Args) -> Run.TransportResult,Args,Error,Out,Records.Token>> & Facts.State: 35 Run.run_observed(~S,~C,~R,~E,~Args,~Error,~Out,~Field.runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body),~Field.runner_observed(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body),token,fields,trace,world,args) 36 def component_transport(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Data,~Error:Data,~Out:Data,~Value:Data,~query:O.Declaration,Ops(Q.Frame),I.Frame,Value>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),token:Records.Token,Q.Error,List<&2,Out>,Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body)>>,fields:Records.Fields,trace:Facts.State,world:W.World,args:Args) -> Run.TransportResult,Args & Maybe<&2,Tick.Tick>,Q.Error,List<&2,Out>,Records.Token,Q.Error,List<&2,Out>,Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body)>>> & Facts.State: 37 match fields: 38 case Records.Fields{namespace,id,name,access,+cursor,slot,clauses,kind}:Run.run_observed(~S,~C,~R,~E,~(Args & Maybe<&2,Tick.Tick>),~Q.Error,~List<&2,Out>,~Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body),~Component.observable_runner_observed(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body),token,Records.Fields{namespace,id,name,access,cursor,slot,clauses,kind},trace,world,(args,cursor)) 39 40 def resource_field(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Type,~Error:Data,~Out:Type,~Value:Data,~declaration:D.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),token:Records.Token>,fields:Records.Fields,context:Ctx.Context>,args:Args) -> Run.TransportResult>,Args,Error,Out,Records.Token>>: 41 match context: 42 case Ctx.Context{world,trace}:returned(~S,~W.World,~Args,~Error,~Out,~Records.Token>,resource_transport(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~declaration,~body,token,fields,trace,world,args)) 43 44 def component(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Args:Data,~Error:Data,~Out:Data,~Value:Data,~query:O.Declaration,Ops(Q.Frame),I.Frame,Value>,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),token:Records.Token,Q.Error,List<&2,Out>,Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body)>>,fields:Records.Fields,context:Ctx.Context>,args:Args) -> Run.TransportResult>,Args & Maybe<&2,Tick.Tick>,Q.Error,List<&2,Out>,Records.Token,Q.Error,List<&2,Out>,Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body)>>>: 45 match context: 46 case Ctx.Context{world,trace}:returned(~S,~W.World,~(Args & Maybe<&2,Tick.Tick>),~Q.Error,~List<&2,Out>,~Records.Token,Q.Error,List<&2,Out>,Component.observable_runner(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body)>>,component_transport(~S,~C,~R,~E,~Ops,~Args,~Error,~Out,~Value,~query,~body,token,fields,trace,world,args)) 47 48 def publisher(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~EventOps:Type -> Type,~builder:Events.Builder(~W.World,~Recovery,~EventOps),~declaration:Events.Declaration,Recovery,EventOps,builder>,~Args:Type,~Error:Data,~Out:Type,~body:@-J:Type -> @-caps:EventOps(J) -> Args -> J -> J & (T.Outcome & Out),token:Records.Token,fields:Records.Fields,context:Ctx.Context>,args:Args) -> Run.TransportResult>,Args,Unit,Publisher.Reply,Records.Token>: 49 match context: 50 case Ctx.Context{world,trace}:returned(~S,~W.World,~Args,~Unit,~Publisher.Reply,~Records.Token,Run.run_observed(~S,~C,~R,~E,~Args,~Unit,~Publisher.Reply,~Publisher.runner(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~declaration,~Args,~Error,~Out,~body),~Publisher.runner_observed(~S,~C,~R,~E,~Recovery,~EventOps,~builder,~declaration,~Args,~Error,~Out,~body),token,fields,trace,world,args)) 51 52 def handlers_resource_field(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~Value:Data,~declaration:D.Declaration,~K:Data,~MachineV:Data,~take:R -> R & Machine.Slot,~put:R -> Machine.Slot -> R,~machine:MachineDecl.Declaration,~same:MachineV -> MachineV -> Bool,~publish:W.World -> Machine.Transition -> W.World,~body:@-H:Type -> @-caps:Ops(H) -> Handlers.Invocation -> H -> H & (T.Outcome & Unit),owners:Handlers.Owners,~String,~Unit,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body)>,context:Ctx.Context>,captured:Machine.Snapshot) -> HandlerEngine.HandlerResult>,Handlers.Entry,~String,~Unit,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body)>,Handlers.Phase>: 53 HandlerContext.run(~S,~C,~R,~E,~MachineV,~Field.runner(~S,~C,~R,~E,~Ops,~Handlers.Invocation,~String,~Unit,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body),~Field.runner_observed(~S,~C,~R,~E,~Ops,~Handlers.Invocation,~String,~Unit,~D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration),~body),~K,~MachineWorld.take(~S,~K,~MachineV,~C,~R,~E,~take),~MachineWorld.put(~S,~K,~MachineV,~C,~R,~E,~put),~publish,~same,~MachineDecl.name(~S,~K,~MachineV,~R,~take,machine),owners,context,captured)