ordinary_reader_query_parameter.bend

bendvy-ecs-core@0.1.0.0 · 52 lines · 0 definitions

1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.0/reader_parameter.bend as RP
4import bendvy-ecs-core@0.1.0.0/ordinary_query_observable.bend as Observable
5import bendvy-ecs-core@0.1.0.0/ordinary_query_declaration.bend as Query
6import bendvy-ecs-core@0.1.0.0/compose.bend as FrameQuery
7import bendvy-ecs-core@0.1.0.0/inspector.bend as Inspector
8import bendvy-ecs-core@0.1.0.0/inspector_query.bend as InspectQuery
9import bendvy-ecs-core@0.1.0.0/world.bend as W
10import bendvy-ecs-core@0.1.0.0/relation_commands.bend as Notice
11import bendvy-ecs-core@0.1.0.0/event_notice_runtime.bend as Mixed
12import bendvy-ecs-core@0.1.0.0/event_family_routing.bend as Route
13
14# Query rows are detached Data values; the shared route context retains the
15# sole World and its affine event/relation history.
16type Rows<S:Data,V:Data> is Data:
17  Rows{rows:List<&2,InspectQuery.ProjectedRow<S,V>>}
18
19def rows_observed(~S:Data,~Store:Type,~R:Type,~P:Data,~V:Data,observed:Inspector.Frame<S,Store,R,Notice.Notice<S,P>> & List<&2,InspectQuery.ProjectedRow<S,V>>) -> W.World<S,Store,R,Notice.Notice<S,P>> & (Unit & (Rows<S,V> & Unit)):
20  match observed:
21    case (Inspector.Frame{world,_},rows):(world,(Unit{},(Rows{rows},Unit{})))
22
23def validate_context(~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>,context:Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,owner:Unit) -> Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Unit & Bool):
24  match context:
25    case Route.Runtime{world,state,tick}:(Route.Runtime{world,state,tick},(owner,True{}))
26
27def with_query_rows(~S:Data,~Store:Type,~R:Type,~P:Data,~F:Type,~H:Type,~Ops:Type,~V:Data,state:Mixed.State<S,P,F,H>,tick:Nat,observed:W.World<S,Store,R,Notice.Notice<S,P>> & (Unit & (Rows<S,V> & Unit))) -> Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Unit & (Rows<S,V> & Unit)):
28  match observed:
29    case (world,(owner,(rows,delta))):(Route.Runtime{world,state,tick},(owner,(rows,delta)))
30
31def prepare_context(~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>,context:Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,+cursor:Maybe<&2,Tick.Tick>,owner:Unit) -> Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>> & (Unit & (Rows<S,V> & Unit)):
32  match context:
33    case Route.Runtime{world,state,tick}:with_query_rows(~S,~Store,~R,~P,~F,~H,~Ops,~V,state,tick,rows_observed(~S,~Store,~R,~P,~V,InspectQuery.each_composed(~Inspector.Frame<S,Store,R,Notice.Notice<S,P>>,~S,~V,Observable.inspect_query(~S,~Store,~R,~Notice.Notice<S,P>,~FrameQuery.Frame<S,Store,R,Notice.Notice<S,P>>,~Ops,~V,~declaration),Inspector.Frame{world,cursor})))
34
35def commit_context(~Context:Type,context:Context,owner:Unit,delta:Unit,+cursor:Tick.Tick) -> Context & Unit:
36  (context,owner)
37
38# Query projection retains no private cursor or shared-history membership.
39# Disposal consumes its Unit owner while preserving the sole affine context.
40def release_context(~Context:Type,context:Context,owner:Unit) -> Context:
41  context
42
43def access_clauses(~S:Data,clauses:List<&2,Query.Clause<S>>) -> List<&2,String>:
44  match clauses:
45    case []:[]
46    case Query.Clause{name,_} <> rest:name <> access_clauses(~S,rest)
47
48def access_of(~S:Data,~Store:Type,~R:Type,~P:Data,~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>) -> List<&2,String>:
49  access_clauses(~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)))
50
51def 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>) -> RP.Param<Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,Unit,Rows<S,V>,Unit,validate_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),prepare_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),commit_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>),release_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>)>:
52  RP.make(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>,~Unit,~Rows<S,V>,~Unit,~validate_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),~prepare_context(~S,~Store,~R,~P,~F,~H,~Ops,~V,~declaration),~commit_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>),~release_context(~Route.Runtime<S,Store,R,Notice.Notice<S,P>,Mixed.State<S,P,F,H>>),access_of(~S,~Store,~R,~P,~Ops,~V,declaration))