1 import Base 2 import ./ordinary_query_declaration.bend as Query 3 import ./ordinary_app_composer.bend as Build 4 import ./ordinary_app_registration_fields.bend as Records 5 import ./ordinary_app_records.bend as Leaf 6 import ./ordinary_app_recipe.bend as Tree 7 import ./ordinary_optional_resource_observation.bend as Leaves 8 import ./world.bend as W 9 import ./system.bend as Sys 10 import ./transaction.bend as T 11 import ./ordinary_optional_resource_system.bend as P 12 import ./ordinary_resource_field_system.bend as Field 13 import ./check.bend as K 14 import ./ordinary_optional_resource_declaration.bend as D 15 import ./ordinary_app_observation_data.bend as DTO 16 17 def field_owner(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Data,~Out:Type,~runner:W.World -> Args -> Sys.Outcome,K.Error,Out>,~clauses:List<&2,Query.Clause>,slot:String,owner:Field.Owner,clauses>) -> Records.Token> & Records.Fields: 18 match owner: 19 case Field.Owner{registry}:Records.field_registry(~S,~C,~R,~E,~Args,~K.Error,~Out,~runner,slot,clauses,registry) 20 21 # The same ordinary resource declaration drives registration, observation and metadata. 22 def extracted(~S:Data,~C:Type,~R:Type,~E:Data,~Owners:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Owners -> Owners & List<&2,Records.Fields>,~Ops:Type -> Type,~Args:Data,~Out:Type,~Value:Data,~declaration:D.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Output:Type,done:Build.Registered,Owners & Leaf.Record>>,DTO.Product,Tree.observe_pair(~W.World,~Rows,~Value,~observe,~Leaves.resource_observe(~S,~C,~R,~E,~Ops,~Value,~declaration)),Leaf.fold_pair(~S,~Owners,~Leaf.Record>>,~fold,~Leaf.observed(~S,~Records.Token>))> -> Output,failed:Build.Registered,Owners,Rows,observe,fold> -> Output,world:W.World,owners:Owners,debug:Bool,result:Records.Token> & Records.Fields) -> Output: 23 match result: 24 case (token,fields):done(Build.appended(~S,~W.World,~Owners,~Rows,~observe,~fold,~Leaf.Record>>,~Value,~Leaves.resource_observe(~S,~C,~R,~E,~Ops,~Value,~declaration),~Leaf.observed(~S,~Records.Token>),world,owners,Leaf.Record{token,fields},debug)) 25 def defined(~S:Data,~C:Type,~R:Type,~E:Data,~Owners:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Owners -> Owners & List<&2,Records.Fields>,~Ops:Type -> Type,~Args:Data,~Out:Type,~Value:Data,~declaration:D.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Output:Type,done:Build.Registered,Owners & Leaf.Record>>,DTO.Product,Tree.observe_pair(~W.World,~Rows,~Value,~observe,~Leaves.resource_observe(~S,~C,~R,~E,~Ops,~Value,~declaration)),Leaf.fold_pair(~S,~Owners,~Leaf.Record>>,~fold,~Leaf.observed(~S,~Records.Token>))> -> Output,failed:Build.Registered,Owners,Rows,observe,fold> -> Output,owners:Owners,recipe:Tree.Recipe,Rows,observe>,debug:Bool,slot:String,result:Field.Defined,Sys.Registry,Field.clauses(~S,~T.Tx,E>,~Ops(T.Tx,E>),D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration))>) -> Output: 26 match result: 27 case Field.Rejected{world}:failed(Build.Registered{world,owners,recipe,debug}) 28 case Field.Defined{world,owner}:extracted(~S,~C,~R,~E,~Owners,~Rows,~observe,~fold,~Ops,~Args,~Out,~Value,~declaration,~body,~Output,done,failed,world,owners,debug,field_owner(~S,~C,~R,~E,~Args,~Out,~P.runner(~S,~C,~R,~E,~Ops,~Args,~Out,~Value,~declaration,~body),~Field.clauses(~S,~T.Tx,E>,~Ops(T.Tx,E>),D.ordinary(~S,~C,~R,~E,~Ops,~Value,declaration)),slot,owner)) 29 def register(~S:Data,~C:Type,~R:Type,~E:Data,~Owners:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Owners -> Owners & List<&2,Records.Fields>,~Ops:Type -> Type,~Args:Data,~Out:Type,~Value:Data,~declaration:D.Declaration,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Output:Type,done:Build.Registered,Owners & Leaf.Record>>,DTO.Product,Tree.observe_pair(~W.World,~Rows,~Value,~observe,~Leaves.resource_observe(~S,~C,~R,~E,~Ops,~Value,~declaration)),Leaf.fold_pair(~S,~Owners,~Leaf.Record>>,~fold,~Leaf.observed(~S,~Records.Token>))> -> Output,failed:Build.Registered,Owners,Rows,observe,fold> -> Output,app:Build.Registered,Owners,Rows,observe,fold>,name:String,slot:String) -> Output: 30 match app: 31 case Build.Registered{world,owners,recipe,debug}:defined(~S,~C,~R,~E,~Owners,~Rows,~observe,~fold,~Ops,~Args,~Out,~Value,~declaration,~body,~Output,done,failed,owners,recipe,debug,slot,P.define(~S,~C,~R,~E,~Ops,~Args,~Out,~Value,~declaration,~body,world,name))