ordinary_app_observation_data.bend
bendvy-ecs-core@0.1.0.0 · 33 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import entity_key_render.bend as KeyText
4import bendvy-ecs-core@0.1.0.0/world.bend as W
5import bendvy-ecs-core@0.1.0.0/compose.bend as Q
6import bendvy-ecs-core@0.1.0.0/ordinary_query_observable.bend as O
7import bendvy-ecs-core@0.1.0.0/ordinary_query_declaration.bend as N
8import bendvy-ecs-core@0.1.0.0/inspector.bend as I
9import bendvy-ecs-core@0.1.0.0/inspector_query.bend as IQ
10# Detached typed observation rows plus their presentation strings.
11# Contains no live World or payload owner; rendered text is not a stable save
12# or wire protocol and may omit information retained in rows.
13type Observation<Rows:Data> is Data:
14 Observation{rows:Rows,rendered:List<&2,String>}
15# Detached heterogeneous pair preserving the left/right observation shape.
16# Nest for additional row types; it does not duplicate affine payload owners.
17type Product<L:Data,R:Data> is Data:
18 Product{left:L,right:R}
19# Private typed DTO; text presentation is a fixture view, not a wire contract.
20type Binding<S:Data> is Data:
21 Binding{namespace:U32,id:U32,name:String,access:List<&2,String>,cursor:Maybe<&2,Tick.Tick>,slot:String,clauses:List<&2,N.Clause<S>>}
22def lowered(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,result:I.Frame<S,C,R,E> & List<&2,IQ.ProjectedRow<S,V>>) -> W.World<S,C,R,E> & List<&2,IQ.ProjectedRow<S,V>>:
23 match result:
24 case (I.Frame{world,_},rows):(world,rows)
25def render_row(~S:Data,~V:Data,~render:V -> String,row:IQ.ProjectedRow<S,V>) -> String:
26 match row:
27 case IQ.ProjectedRow{W.Handle{namespace,id},data}:U32.show(namespace) ++ ":" ++ KeyText.show(id) ++ ":" ++ render(data)
28def appended(~S:Data,~C:Type,~R:Type,~E:Data,~Rows:Data,~V:Data,~render:V -> String,previous:Rows,summaries:List<&2,String>,result:W.World<S,C,R,E> & List<&2,IQ.ProjectedRow<S,V>>) -> W.World<S,C,R,E> & Observation<Product<Rows,List<&2,IQ.ProjectedRow<S,V>>>>:
29 match result:
30 case (world,+rows):(world,Observation{Product{previous,rows},List.append(&2,String,summaries,[List.show(&2,IQ.ProjectedRow<S,V>,render_row(~S,~V,~render),rows)])})
31def append_previous(~S:Data,~C:Type,~R:Type,~E:Data,~Rows:Data,~Ops:Type -> Type,~V:Data,~query:O.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>),I.Frame<S,C,R,E>,V>,~render:V -> String,result:W.World<S,C,R,E> & Observation<Rows>) -> W.World<S,C,R,E> & Observation<Product<Rows,List<&2,IQ.ProjectedRow<S,V>>>>:
32 match result:
33 case (world,Observation{previous,summaries}):appended(~S,~C,~R,~E,~Rows,~V,~render,previous,summaries,lowered(~S,~C,~R,~E,~V,IQ.each_composed(~I.Frame<S,C,R,E>,~S,~V,~O.inspect_query(~S,~C,~R,~E,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),~V,~query),I.Frame{world,None{}})))