ordinary_app_reader_parameter.bend

bendvy-ecs-core@0.1.0.1 · 74 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.1/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.1/reader_parameter.bend as RP
4import bendvy-ecs-core@0.1.0.1/ordinary_query_observable.bend as Observable
5import bendvy-ecs-core@0.1.0.1/ordinary_query_declaration.bend as Query
6import bendvy-ecs-core@0.1.0.1/compose.bend as FrameQuery
7import bendvy-ecs-core@0.1.0.1/inspector.bend as Inspector
8import bendvy-ecs-core@0.1.0.1/inspector_query.bend as InspectQuery
9import bendvy-ecs-core@0.1.0.1/world.bend as W
10import bendvy-ecs-core@0.1.0.1/relation_commands.bend as Notice
11import bendvy-ecs-core@0.1.0.1/event_notice_runtime.bend as Mixed
12import bendvy-ecs-core@0.1.0.1/event_family_routing.bend as Route
13import bendvy-ecs-core@0.1.0.1/event_runtime.bend as Ev
14import bendvy-ecs-core@0.1.0.1/event_stream.bend as Stream
15import bendvy-ecs-core@0.1.0.1/event_family_runtime.bend as Family
16import bendvy-ecs-core@0.1.0.1/ordinary_event_declaration.bend as Event
17import bendvy-ecs-core@0.1.0.1/relation_failure_reader.bend as KDecl
18import bendvy-ecs-core@0.1.0.1/relation_failure_runtime.bend as K
19import bendvy-ecs-core@0.1.0.1/relation_failure_disposal.bend as KDispose
20import bendvy-ecs-core@0.1.0.1/internal/relation_failures/domains.bend as KD
21import bendvy-ecs-core@0.1.0.1/internal/relation_failures/readings.bend as KRead
22import bendvy-ecs-core@0.1.0.1/ordinary_removal_provision.bend as Provision
23import bendvy-ecs-core@0.1.0.1/ordinary_declaration.bend as Identity
24import bendvy-ecs-core@0.1.0.1/removals.bend as Rm
25import bendvy-ecs-core@0.1.0.1/ordinary_reader_query_parameter.bend as QParam
26import bendvy-ecs-core@0.1.0.1/ordinary_reader_stream_parameter.bend as SParam
27import bendvy-ecs-core@0.1.0.1/ordinary_app_registration_fields.bend as Fields
28import bendvy-ecs-core@0.1.0.1/relation_types.bend as Relations
29
30# Constructors bind retained facts to the same operational declaration and parameter.
31# Applications never pass a parallel clause list to registration.
32type Declared<S:Data,Parameter:Data> is Data:
33  Declared{parameter:Parameter,uses:List<&2,Fields.DeclaredUse>}
34def query_uses(~S:Data,clauses:List<&2,Query.Clause<S>>) -> List<&2,Fields.DeclaredUse>:
35  match clauses:
36    case []:[]
37    case Query.Clause{key,mode} <> rest:Fields.DeclaredUse{Fields.ComponentUse{},Fields.QuerySource{},key,mode} <> query_uses(~S,rest)
38def event_mode(mode:Event.Mode) -> Query.Mode:
39  match mode:
40    case Event.Read{}:Query.Read{}
41    case Event.Write{}:Query.Write{}
42def event_uses(~S:Data,~E:Data,declaration:Event.Declaration<S,E>) -> List<&2,Fields.DeclaredUse>:
43  match declaration:
44    case Event.Declaration{Event.Domain{key},mode}:[Fields.DeclaredUse{Fields.EventUse{},Fields.MessageSource{},key,event_mode(mode)}]
45def relation_uses(~S:Data,declarations:List<&2,KDecl.Declaration<S>>) -> List<&2,Fields.DeclaredUse>:
46  match declarations:
47    case []:[]
48    case KDecl.Declaration{Relations.Descriptor{_,key,_,_}} <> rest:Fields.DeclaredUse{Fields.EventUse{},Fields.RelationFailureSource{},key,Query.Read{}} <> relation_uses(~S,rest)
49
50def from_observable(~S:Data,~Store:Type,~R:Type,~P:Data,~F:Type,~H:Type,~Ops:Type,~V:Data,~declaration:Observable.Declaration<S,FrameQuery.Frame<S,Store,R,Notice.Notice<S,P>>,Ops,Inspector.Frame<S,Store,R,Notice.Notice<S,P>>,V>) -> Declared<S,RP.Param<Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Unit,QParam.Rows<S,V>,Unit,QParam.validate_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),QParam.prepare_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),QParam.commit_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>),QParam.release_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>)>>:
51  Declared{QParam.from_observable(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),query_uses(~S,Query.clauses(~S,~FrameQuery.Frame<S,Store,R,Notice.Notice<S,P>>,~Ops,Observable.operational(~S,~FrameQuery.Frame<S,Store,R,Notice.Notice<S,P>>,~Ops,~Inspector.Frame<S,Store,R,Notice.Notice<S,P>>,~V,declaration)))}
52
53def event_param(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~H:Type,
54  ~take:F -> F & Stream.Stream<S,E>,
55  ~put:F -> Stream.Stream<S,E> -> F,
56  ~declaration:Event.Declaration<S,E>) -> Declared<S,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,SParam.EventOwner<S,C,R,P,E,F,H,take,put>,SParam.EventView<S,E>,Nat,
57  SParam.validate_event(~S,~C,~R,~P,~E,~F,~H,~take,~put,~declaration),SParam.prepare_event(~S,~C,~R,~P,~E,~F,~H,~take,~put,~declaration),SParam.commit_event(~S,~C,~R,~P,~E,~F,~H,~take,~put),SParam.release_event(~S,~C,~R,~P,~E,~F,~H,~take,~put)>>:
58  Declared{SParam.event_param(~S,~C,~R,~P,~E,~F,~H,~take,~put,~declaration),event_uses(~S,~E,declaration)}
59
60def removal_param(~S:Data,~C:Type,~R:Type,~P:Data,~Payload:Type,~F:Type,~H:Type,
61  ~inject:Identity.Declaration<S,Payload> -> W.Handle<S> -> Notice.Notice<S,P>,
62  ~select:Notice.Notice<S,P> -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,Payload>>>,
63  ~selection:Provision.Selection<S,Payload,Notice.Notice<S,P>,inject,select>) -> Declared<S,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,SParam.RemovalOwner<S,Payload,Notice.Notice<S,P>,select>,SParam.RemovalView<S,Payload>,Nat,
64  SParam.validate_removal(~S,~C,~R,~P,~Payload,~F,~H,~inject,~select,~selection),SParam.prepare_removal(~S,~C,~R,~P,~Payload,~F,~H,~select),SParam.commit_removal(~S,~C,~R,~P,~Payload,~F,~H,~select),SParam.release_removal(~S,~C,~R,~P,~Payload,~F,~H,~select)>>:
65  Declared{SParam.removal_param(~S,~C,~R,~P,~Payload,~F,~H,~inject,~select,~selection),[Fields.DeclaredUse{Fields.EventUse{},Fields.RemovalSource{},SParam.removal_name(~S,~Payload,~Notice.Notice<S,P>,~inject,~select,selection),Query.Read{}}]}
66
67def relation_param(~S:Data,~C:Type,~R:Type,~P:Data,~F:Type,~H:Type,
68  ~declarations:List<&2,KDecl.Declaration<S>>) -> Declared<S,RP.Param<Route.Runtime<S,C,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,SParam.RelationOwner<S,P>,SParam.RelationView<S,P>,SParam.RelationDelta,
69  SParam.validate_relation(~S,~C,~R,~P,~F,~H,~declarations),SParam.prepare_relation(~S,~C,~R,~P,~F,~H,~declarations),SParam.commit_relation(~S,~C,~R,~P,~F,~H),SParam.release_relation(~S,~C,~R,~P,~F,~H)>>:
70  Declared{SParam.relation_param(~S,~C,~R,~P,~F,~H,~declarations),relation_uses(~S,declarations)}
71
72def pair(~S:Data,~W:Type,~OwnerA:Type,~ViewA:Data,~DeltaA:Type,~validateA:W -> OwnerA -> W & (OwnerA & Bool),~prepareA:W -> @+cursor:Maybe<&2,Tick.Tick> -> OwnerA -> W & (OwnerA & (ViewA & DeltaA)),~commitA:W -> OwnerA -> DeltaA -> @+cursor:Tick.Tick -> W & OwnerA,~releaseA:W -> OwnerA -> W,~OwnerB:Type,~ViewB:Data,~DeltaB:Type,~validateB:W -> OwnerB -> W & (OwnerB & Bool),~prepareB:W -> @+cursor:Maybe<&2,Tick.Tick> -> OwnerB -> W & (OwnerB & (ViewB & DeltaB)),~commitB:W -> OwnerB -> DeltaB -> @+cursor:Tick.Tick -> W & OwnerB,~releaseB:W -> OwnerB -> W,left:Declared<S,RP.Param<W,OwnerA,ViewA,DeltaA,validateA,prepareA,commitA,releaseA>>,right:Declared<S,RP.Param<W,OwnerB,ViewB,DeltaB,validateB,prepareB,commitB,releaseB>>) -> Declared<S,RP.Param<W,OwnerA & OwnerB,RP.ViewPair<ViewA,ViewB>,DeltaA & DeltaB,RP.pair_validate_fn(~W,~OwnerA,~OwnerB,~validateA,~validateB),RP.pair_prepare_fn(~W,~OwnerA,~OwnerB,~ViewA,~ViewB,~DeltaA,~DeltaB,~prepareA,~prepareB),RP.pair_commit_fn(~W,~OwnerA,~OwnerB,~DeltaA,~DeltaB,~commitA,~commitB),RP.pair_release_fn(~W,~OwnerA,~OwnerB,~releaseA,~releaseB)>>:
73  match left right:
74    case Declared{left,leftUses} Declared{right,rightUses}:Declared{RP.pair(~W,~OwnerA,~ViewA,~DeltaA,~validateA,~prepareA,~commitA,~releaseA,~OwnerB,~ViewB,~DeltaB,~validateB,~prepareB,~commitB,~releaseB,left,right),List.append(&2,Fields.DeclaredUse,leftUses,rightUses)}