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 Tx 6 import ./commands.bend as Cmd 7 import ./capabilities.bend as Cap 8 import ./reader_parameter.bend as RP 9 import ./event_notice_runtime.bend as Mixed 10 import ./event_family_routing.bend as Route 11 import ./relation_commands.bend as Notice 12 import ./internal/relation_failures/domains.bend as D 13 import ./ordinary_reader_system.bend as Ordinary 14 import ./ordinary_app_reader_parameter.bend as Parameter 15 import ./ordinary_app_registration_fields.bend as Fields 16 17 import ./ordinary_app_composer.bend as Build 18 import ./ordinary_app_records.bend as Pair 19 import ./ordinary_app_recipe.bend as Tree 20 import ./ordinary_app_observation_data.bend as DTO 21 22 # Retained declaration facts belong to the provider's existing Declaration owner. 23 # The ordinary definition receives the same generated parameter and facts together. 24 def define_mixed(~S:Data,~C:Type,~R:Type,~P:Data,~F:Type,~H:Type, 25 ~Reader:Type,~View:Data,~Delta:Type,~Args:Type,~Failure:Data,~Output:Type, 26 ~validateFn:Route.Runtime,Mixed.State> -> Reader -> Route.Runtime,Mixed.State> & (Reader & Bool), 27 ~prepareFn:Route.Runtime,Mixed.State> -> @+cursor:Maybe<&2,Tick.Tick> -> Reader -> Route.Runtime,Mixed.State> & (Reader & (View & Delta)), 28 ~commitFn:Route.Runtime,Mixed.State> -> Reader -> Delta -> @+cursor:Tick.Tick -> Route.Runtime,Mixed.State> & Reader,~releaseFn:Route.Runtime,Mixed.State> -> Reader -> Route.Runtime,Mixed.State>, 29 ~Ops:Type -> Type, 30 ~body:@-K:Type -> @-caps:Ops(K) -> (View & Args) -> K -> K & (Tx.Outcome & Output), 31 ~grant:Ops(Tx.Tx>,Notice.Notice>), 32 ~sync:F -> Nat -> List<&2,P> -> F, 33 ~classify:Notice.Notice -> Maybe>, 34 ~initialize:Route.Runtime,Mixed.State> -> RP.RegistrationFacts -> Route.Runtime,Mixed.State> & (Reader & RP.Param,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>), 35 descriptor:Parameter.Declared,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>>, 36 context:Route.Runtime,Mixed.State>,name:String) -> Ordinary.Definition,Mixed.State>,Ordinary.Provider,Ordinary.Invocation<(Mixed.State & Nat),Reader,RP.Param,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>,Args>,Empty,Ordinary.Envelope<(Mixed.State & Nat),Reader,RP.Param,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>,Failure,Output>,Ordinary.shared_runner(~S,~C,~R,~P,~F,~H,~Reader,~View,~Delta,~Args,~List<&2,Fields.DeclaredUse>,~Failure,~Output,~validateFn,~prepareFn,~commitFn,~releaseFn,~Ops,~body,~grant,~sync,~classify)>,Reader,RP.Param,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>>,RP.Param,Mixed.State>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>>: 37 match descriptor: 38 case Parameter.Declared{parameter,uses}:Ordinary.define_mixed(~S,~C,~R,~P,~F,~H,~Reader,~View,~Delta,~Args,~List<&2,Fields.DeclaredUse>,~Failure,~Output,~validateFn,~prepareFn,~commitFn,~releaseFn,~Ops,~body,~grant,~sync,~classify,~initialize,parameter,uses,context,name) 39 40 # One registration produces one Binding, even when its parameters span categories. 41 def fold(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,value:Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>) -> Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>> & List<&2,Fields.Fields>: 42 match value: 43 case Ordinary.Provider{Sys.Registry{+namespace,+id,+name,+access,+cursor},reader,parameter,+uses}:(Ordinary.Provider{Sys.Registry{namespace,id,name,access,cursor},reader,parameter,uses},[Fields.Fields{namespace,id,name,access,cursor,name,[],Fields.MixedKind{uses}}]) 44 45 def sources(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,value:Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>) -> Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>> & List<&2,Fields.DeclaredUse>: 46 match value: 47 case Ordinary.Provider{registry,reader,parameter,+uses}:(Ordinary.Provider{registry,reader,parameter,uses},uses) 48 49 def fold_meta_returned(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,meta:Meta,result:Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>> & List<&2,Fields.Fields>) -> (Meta & Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>) & List<&2,Fields.Fields>: 50 match result: 51 case (provider,fields):((meta,provider),fields) 52 def fold_meta(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,value:Meta & Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>) -> (Meta & Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>) & List<&2,Fields.Fields>: 53 match value: 54 case (meta,provider):fold_meta_returned(~S,~C,~R,~E,~Args,~Error,~Output,~runner,~Reader,~Param,~Meta,meta,fold(~S,~C,~R,~E,~Args,~Error,~Output,~runner,~Reader,~Param,provider)) 55 # Operational runtime metadata remains affine in H, beside the actual provider. 56 # The library composes the fold; application setup supplies no debug adapter. 57 def attach(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,~Previous:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~previousFold:Previous -> Previous & List<&2,Fields.Fields>,world:W.World,previous:Previous,meta:Meta,provider:Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>,recipe:Tree.Recipe,Rows,observe>,debug:Bool) -> Build.Registered,Previous & (Meta & Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>),Rows,observe,Pair.fold_pair(~S,~Previous,~(Meta & Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>),~previousFold,~fold_meta(~S,~C,~R,~E,~Args,~Error,~Output,~runner,~Reader,~Param,~Meta))>: 58 Build.Registered{world,(previous,(meta,provider)),recipe,debug} 59 60 # Registration refusal recovers the generated descriptor. If disposal itself 61 # refuses, its sole provider still owns the initialized readers and declaration. 62 type Recovered<-S:Data,-Context:Type,-Provider:Type,-Param:Data> is Type: 63 Registered{context:Context,provider:Provider} 64 Rejected{context:Context,descriptor:Parameter.Declared} 65 DisposalRejected{context:Context,provider:Provider,descriptor:Parameter.Declared} 66 def disposal_recovered(~S:Data,~Context:Type,~Registry:Type,~Reader:Type,~Param:Data,context:Context,parameter:Param,provider:Ordinary.Provider>) -> Recovered>,Param>: 67 match provider: 68 case Ordinary.Provider{registry,reader,initialized,+uses}:DisposalRejected{context,Ordinary.Provider{registry,reader,initialized,uses},Parameter.Declared{parameter,uses}} 69 def recover(~S:Data,~Context:Type,~Registry:Type,~Reader:Type,~Param:Data,result:Ordinary.Definition>,Param,List<&2,Fields.DeclaredUse>>) -> Recovered>,Param>: 70 match result: 71 case Ordinary.DefinitionRegistered{context,provider}:Registered{context,provider} 72 case Ordinary.DefinitionRejected{context,parameter,uses}:Rejected{context,Parameter.Declared{parameter,uses}} 73 case Ordinary.DefinitionDisposalRejected{context,provider,parameter}:disposal_recovered(~S,~Context,~Registry,~Reader,~Param,context,parameter,provider) 74 75 # A routed application already owns its sole World inside Context. 76 def attach_context(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World -> Args -> Sys.Outcome,Error,Output>,~Reader:Type,~Param:Type,~Context:Type,~Previous:Type,~Rows:Data,~observe:Context -> Context & DTO.Observation,~previousFold:Previous -> Previous & List<&2,Fields.Fields>,context:Context,previous:Previous,provider:Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>,recipe:Tree.Recipe,debug:Bool) -> Build.Registered,Reader,Param,List<&2,Fields.DeclaredUse>>,Rows,observe,Pair.fold_pair(~S,~Previous,~Ordinary.Provider,Reader,Param,List<&2,Fields.DeclaredUse>>,~previousFold,~fold(~S,~C,~R,~E,~Args,~Error,~Output,~runner,~Reader,~Param))>: 77 Build.Registered{context,(previous,provider),recipe,debug}