1 import Base 2 import ./ordinary_component_binding.bend as B 3 import ./ordinary_declaration.bend as Identity 4 import ./ordinary_query_declaration.bend as D 5 import ./inspector.bend as I 6 import ./inspector_query.bend as Q 7 import ./inspector_query_projection.bend as Projection 8 import ./column.bend as Col 9 import ./inspector_query_projection.bend as Rows 10 11 # Ordinary read-only Inspector query plus clauses from the same binding. 12 # Retains no World or registered reader; raw construction is trusted setup. 13 type Declaration<-S:Data,-H:Type,-V:Data> is Type: 14 Declaration{query:Q.ReadQuery,clauses:List<&2,D.Clause>} 15 # Consume this declaration to obtain its typed read-query capability. 16 # Does not enumerate rows or advance an observation/system cursor. 17 def query(~S:Data,~H:Type,~V:Data,declaration:Declaration) -> Q.ReadQuery: 18 match declaration: 19 case Declaration{query,_}:query 20 # Return declaration and detached clauses without accessing World or 21 # reading components. Prefer this when retaining the declaration owner. 22 def observe(~S:Data,~H:Type,~V:Data,declaration:Declaration) -> Declaration & List<&2,D.Clause>: 23 match declaration: 24 case Declaration{query,+clauses}:(Declaration{query,clauses},clauses) 25 # Build required component inspection from its operational binding. 26 # Derives read grant and clauses together; view preserves P while exposing V. 27 def read(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,~R:Type,~E:Data,~binding:B.Binding) -> Declaration,V>: 28 Declaration{Q.grant(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~B.family(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),~Projection.Required{}),[D.Clause{Identity.key(~S,~P,B.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)),D.Read{}}]} 29 # Build optional component inspection, preserving explicit absence for a 30 # live entity. Canonical lookup still rejects stale/foreign handles. 31 def optional(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,~R:Type,~E:Data,~binding:B.Binding) -> Declaration,V>: 32 Declaration{Q.grant(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~B.family(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),~Projection.Optional{}),[D.Clause{Identity.key(~S,~P,B.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)),D.Optional{}}]} 33 # Build a presence-plus-added filter using Inspector cursor visibility. 34 # Does not consume registered system lifecycle/event cursors during setup. 35 def added(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,~R:Type,~E:Data,~binding:B.Binding) -> Declaration,V>: 36 Declaration{Q.grant(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~B.family(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),~Projection.Added{}),[D.Clause{Identity.key(~S,~P,B.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)),D.Added{}}]} 37 # Build a presence-plus-changed filter relative to the Inspector cursor. 38 # Operational binding and descriptive clauses share one source of truth. 39 def changed(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,~R:Type,~E:Data,~binding:B.Binding) -> Declaration,V>: 40 Declaration{Q.grant(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~B.family(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),~Projection.Changed{}),[D.Clause{Identity.key(~S,~P,B.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)),D.Changed{}}]} 41 # Consume declaration to obtain its detached query description, with no 42 # component read, registration execution or cursor change. 43 def clauses(~S:Data,~H:Type,~V:Data,declaration:Declaration) -> List<&2,D.Clause>: 44 match declaration: 45 case Declaration{_,clauses}:clauses 46 def each_result(~S:Data,~H:Type,~V:Data,clauses:List<&2,D.Clause>,result:H & List<&2,Rows.Row>) -> H & (List<&2,Rows.Row> & List<&2,D.Clause>): 47 match result: 48 case (owner,rows):(owner,(rows,clauses)) 49 # Execute the declared read-only enumeration, returning owner, detached rows 50 # and retained clauses. Uses the matching Inspector grant; no mutable payload 51 # alias or registered system reader ownership escapes. 52 def each(~S:Data,~H:Type,~V:Data,~declaration:Declaration,owner:H) -> H & (List<&2,Rows.Row> & List<&2,D.Clause>): 53 each_result(~S,~H,~V,clauses(~S,~H,~V,declaration),Q.each(~H,~S,~V,~query(~S,~H,~V,declaration),owner))