ordinary_app_reader_fields.bend
1import Base
2import bendvy-ecs-core@0.1.0.1/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.1/world.bend as W
4import bendvy-ecs-core@0.1.0.1/system.bend as Sys
5import bendvy-ecs-core@0.1.0.1/transaction.bend as Tx
6import bendvy-ecs-core@0.1.0.1/commands.bend as Cmd
7import bendvy-ecs-core@0.1.0.1/capabilities.bend as Cap
8import bendvy-ecs-core@0.1.0.1/reader_parameter.bend as RP
9import bendvy-ecs-core@0.1.0.1/event_notice_runtime.bend as Mixed
10import bendvy-ecs-core@0.1.0.1/event_family_routing.bend as Route
11import bendvy-ecs-core@0.1.0.1/relation_commands.bend as Notice
12import bendvy-ecs-core@0.1.0.1/internal/relation_failures/domains.bend as D
13import bendvy-ecs-core@0.1.0.1/ordinary_reader_system.bend as Ordinary
14import bendvy-ecs-core@0.1.0.1/ordinary_app_reader_parameter.bend as Parameter
15import bendvy-ecs-core@0.1.0.1/ordinary_app_registration_fields.bend as Fields
16
17import bendvy-ecs-core@0.1.0.1/ordinary_app_composer.bend as Build
18import bendvy-ecs-core@0.1.0.1/ordinary_app_records.bend as Pair
19import bendvy-ecs-core@0.1.0.1/ordinary_app_recipe.bend as Tree
20import bendvy-ecs-core@0.1.0.1/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.
24def 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<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> -> Reader -> Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Reader & Bool),
27 ~prepareFn:Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> -> @+cursor:Maybe<&2,Tick.Tick> -> Reader -> Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Reader & (View & Delta)),
28 ~commitFn:Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> -> Reader -> Delta -> @+cursor:Tick.Tick -> Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & Reader,~releaseFn:Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> -> Reader -> Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,
29 ~Ops:Type -> Type,
30 ~body:@-K:Type -> @-caps:Ops(K) -> (View & Args) -> K -> K & (Tx.Outcome<Failure> & Output),
31 ~grant:Ops(Tx.Tx<W.World<S,C,R,Notice.Notice<S,P>>,Notice.Notice<S,P>>),
32 ~sync:F -> Nat -> List<&2,P> -> F,
33 ~classify:Notice.Notice<S,P> -> Maybe<D.DescriptorKey<S>>,
34 ~initialize:Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> -> RP.RegistrationFacts -> Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Reader & RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>),
35 descriptor:Parameter.Declared<S,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>>,
36 context:Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,name:String) -> Ordinary.Definition<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Ordinary.Provider<Sys.Registry<S,C,R,Notice.Notice<S,P>,Ordinary.Invocation<(Mixed.State<S,P,F,H> & Nat),Reader,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>,Args>,Empty,Ordinary.Envelope<(Mixed.State<S,P,F,H> & Nat),Reader,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,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<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Reader,View,Delta,validateFn,prepareFn,commitFn,releaseFn>,List<&2,Fields.DeclaredUse>>,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,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.
41def fold(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,value:Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>) -> Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>> & List<&2,Fields.Fields<S>>:
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
45def sources(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,value:Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>) -> Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,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
49def fold_meta_returned(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,meta:Meta,result:Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>> & List<&2,Fields.Fields<S>>) -> (Meta & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>) & List<&2,Fields.Fields<S>>:
50 match result:
51 case (provider,fields):((meta,provider),fields)
52def fold_meta(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,value:Meta & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>) -> (Meta & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>) & List<&2,Fields.Fields<S>>:
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.
57def attach(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,~Meta:Type,~Previous:Type,~Rows:Data,~observe:W.World<S,C,R,E> -> W.World<S,C,R,E> & DTO.Observation<Rows>,~previousFold:Previous -> Previous & List<&2,Fields.Fields<S>>,world:W.World<S,C,R,E>,previous:Previous,meta:Meta,provider:Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>,recipe:Tree.Recipe<W.World<S,C,R,E>,Rows,observe>,debug:Bool) -> Build.Registered<S,W.World<S,C,R,E>,Previous & (Meta & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>),Rows,observe,Pair.fold_pair(~S,~Previous,~(Meta & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,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.
62type Recovered<-S:Data,-Context:Type,-Provider:Type,-Param:Data> is Type:
63 Registered{context:Context,provider:Provider}
64 Rejected{context:Context,descriptor:Parameter.Declared<S,Param>}
65 DisposalRejected{context:Context,provider:Provider,descriptor:Parameter.Declared<S,Param>}
66def disposal_recovered(~S:Data,~Context:Type,~Registry:Type,~Reader:Type,~Param:Data,context:Context,parameter:Param,provider:Ordinary.Provider<Registry,Reader,Param,List<&2,Fields.DeclaredUse>>) -> Recovered<S,Context,Ordinary.Provider<Registry,Reader,Param,List<&2,Fields.DeclaredUse>>,Param>:
67 match provider:
68 case Ordinary.Provider{registry,reader,initialized,+uses}:DisposalRejected{context,Ordinary.Provider{registry,reader,initialized,uses},Parameter.Declared{parameter,uses}}
69def recover(~S:Data,~Context:Type,~Registry:Type,~Reader:Type,~Param:Data,result:Ordinary.Definition<Context,Ordinary.Provider<Registry,Reader,Param,List<&2,Fields.DeclaredUse>>,Param,List<&2,Fields.DeclaredUse>>) -> Recovered<S,Context,Ordinary.Provider<Registry,Reader,Param,List<&2,Fields.DeclaredUse>>,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.
76def attach_context(~S:Data,~C:Type,~R:Type,~E:Data,~Args:Type,~Error:Data,~Output:Type,~runner:W.World<S,C,R,E> -> Args -> Sys.Outcome<W.World<S,C,R,E>,Error,Output>,~Reader:Type,~Param:Type,~Context:Type,~Previous:Type,~Rows:Data,~observe:Context -> Context & DTO.Observation<Rows>,~previousFold:Previous -> Previous & List<&2,Fields.Fields<S>>,context:Context,previous:Previous,provider:Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>,recipe:Tree.Recipe<Context,Rows,observe>,debug:Bool) -> Build.Registered<S,Context,Previous & Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,Reader,Param,List<&2,Fields.DeclaredUse>>,Rows,observe,Pair.fold_pair(~S,~Previous,~Ordinary.Provider<Sys.Registry<S,C,R,E,Args,Error,Output,runner>,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}