1 import Base 2 import ./change_tick.bend as Tick 3 import ./reader_parameter.bend as RP 4 import ./ordinary_query_observable.bend as Observable 5 import ./ordinary_query_declaration.bend as Query 6 import ./compose.bend as FrameQuery 7 import ./inspector.bend as Inspector 8 import ./inspector_query.bend as InspectQuery 9 import ./world.bend as W 10 import ./relation_commands.bend as Notice 11 import ./event_notice_runtime.bend as Mixed 12 import ./event_family_routing.bend as Route 13 import ./event_runtime.bend as Ev 14 import ./event_stream.bend as Stream 15 import ./event_family_runtime.bend as Family 16 import ./ordinary_event_declaration.bend as Event 17 import ./relation_failure_reader.bend as KDecl 18 import ./relation_failure_runtime.bend as K 19 import ./relation_failure_disposal.bend as KDispose 20 import ./internal/relation_failures/domains.bend as KD 21 import ./internal/relation_failures/readings.bend as KRead 22 import ./ordinary_removal_provision.bend as Provision 23 import ./ordinary_declaration.bend as Identity 24 import ./removals.bend as Rm 25 import ./ordinary_reader_query_parameter.bend as QParam 26 import ./ordinary_reader_stream_parameter.bend as SParam 27 import ./ordinary_app_registration_fields.bend as Fields 28 import ./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. 32 type Declared is Data: 33 Declared{parameter:Parameter,uses:List<&2,Fields.DeclaredUse>} 34 def query_uses(~S:Data,clauses:List<&2,Query.Clause>) -> 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) 38 def event_mode(mode:Event.Mode) -> Query.Mode: 39 match mode: 40 case Event.Read{}:Query.Read{} 41 case Event.Write{}:Query.Write{} 42 def event_uses(~S:Data,~E:Data,declaration:Event.Declaration) -> 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)}] 45 def relation_uses(~S:Data,declarations:List<&2,KDecl.Declaration>) -> 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 50 def from_observable(~S:Data,~Store:Type,~R:Type,~P:Data,~F:Type,~H:Type,~Ops:Type,~V:Data,~declaration:Observable.Declaration>,Ops,Inspector.Frame>,V>) -> Declared,Mixed.State>,Unit,QParam.Rows,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,Mixed.State>),QParam.release_context(~Route.Runtime,Mixed.State>)>>: 51 Declared{QParam.from_observable(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),query_uses(~S,Query.clauses(~S,~FrameQuery.Frame>,~Ops,Observable.operational(~S,~FrameQuery.Frame>,~Ops,~Inspector.Frame>,~V,declaration)))} 52 53 def event_param(~S:Data,~C:Type,~R:Type,~P:Data,~E:Data,~F:Type,~H:Type, 54 ~take:F -> F & Stream.Stream, 55 ~put:F -> Stream.Stream -> F, 56 ~declaration:Event.Declaration) -> Declared,Mixed.State>,SParam.EventOwner,SParam.EventView,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 60 def removal_param(~S:Data,~C:Type,~R:Type,~P:Data,~Payload:Type,~F:Type,~H:Type, 61 ~inject:Identity.Declaration -> W.Handle -> Notice.Notice, 62 ~select:Notice.Notice -> Maybe<&2,Rm.Record>>, 63 ~selection:Provision.Selection,inject,select>) -> Declared,Mixed.State>,SParam.RemovalOwner,select>,SParam.RemovalView,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,~inject,~select,selection),Query.Read{}}]} 66 67 def relation_param(~S:Data,~C:Type,~R:Type,~P:Data,~F:Type,~H:Type, 68 ~declarations:List<&2,KDecl.Declaration>) -> Declared,Mixed.State>,SParam.RelationOwner,SParam.RelationView,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 72 def 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>,right:Declared>) -> Declared,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)}