ordinary_query_builder.bend
bendvy-ecs-core@0.1.0.4 · 66 lines · 8 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/ordinary_query_observable.bend as O
3import bendvy-ecs-core@0.1.0.4/ordinary_query_declaration.bend as N
4import bendvy-ecs-core@0.1.0.4/ordinary_component_binding.bend as B
5import bendvy-ecs-core@0.1.0.4/inspector_query_projection.bend as P
6import bendvy-ecs-core@0.1.0.4/inspector_query.bend as IQ
7import bendvy-ecs-core@0.1.0.4/inspector.bend as I
8import bendvy-ecs-core@0.1.0.4/compose.bend as Q
9import bendvy-ecs-core@0.1.0.4/component.bend as C
10import bendvy-ecs-core@0.1.0.4/column.bend as Col
11import bendvy-ecs-core@0.1.0.4/capabilities.bend as Cap
12import bendvy-ecs-core@0.1.0.4/internal/query_read_session.bend as Session
13
14
15
16
17
18
19
20
21
22type Builder<-S:Data,-Store:Type,-R:Type,-E:Data,-H:Type,-G:Type,-V:Data> is Type:
23 Builder{ordinary:Unit -> O.Declaration<S,H,G,I.Frame<S,Store,R,E>,V>,session:Unit -> P.DeclaredSelection<Session.Owner<S,Store>,S,V>}
24
25
26def ordinary(~S:Data,~Store:Type,~R:Type,~E:Data,~H:Type,~G:Type,~V:Data,builder:Builder<S,Store,R,E,H,G,V>) -> O.Declaration<S,H,G,I.Frame<S,Store,R,E>,V>:
27 match builder:
28 case Builder{ordinary,_}:ordinary(Unit{})
29def session(~S:Data,~Store:Type,~R:Type,~E:Data,~H:Type,~G:Type,~V:Data,builder:Builder<S,Store,R,E,H,G,V>) -> P.DeclaredSelection<Session.Owner<S,Store>,S,V>:
30 match builder:
31 case Builder{_,session}:session(Unit{})
32
33
34
35
36def read(~S:Data,~Store:Type,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~view:Payload -> Payload & V,~R:Type,~E:Data,~binding:B.Binding<S,Store,Rest,Payload,V,Token,take,put,view>) -> Builder<S,Store,R,E,Q.Frame<S,Store,R,E>,Cap.Read<Q.Frame<S,Store,R,E>,V>,C.Access<V>>:
37 Builder{_=>O.read(~S,~Store,~Rest,~Payload,~V,~Token,~take,~put,~view,~R,~E,~binding),_=>Session.slot(~S,~Store,~Rest,~Payload,~V,~take,~put,~view,~Q.Required{})}
38
39
40
41
42def optional(~S:Data,~Store:Type,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~view:Payload -> Payload & V,~R:Type,~E:Data,~binding:B.Binding<S,Store,Rest,Payload,V,Token,take,put,view>) -> Builder<S,Store,R,E,Q.Frame<S,Store,R,E>,Cap.Read<Q.Frame<S,Store,R,E>,V>,C.Access<V>>:
43 Builder{_=>O.optional(~S,~Store,~Rest,~Payload,~V,~Token,~take,~put,~view,~R,~E,~binding),_=>Session.slot(~S,~Store,~Rest,~Payload,~V,~take,~put,~view,~Q.Optional{})}
44
45
46
47
48
49def pair(~S:Data,~Store:Type,~Resource:Type,~E:Data,~H:Type,~L:Type,~R:Type,~LV:Data,~RV:Data,~left:Builder<S,Store,Resource,E,H,L,LV>,~right:Builder<S,Store,Resource,E,H,R,RV>) -> Builder<S,Store,Resource,E,H,L & R,P.Product<LV,RV>>:
50 Builder{_=>O.pair(~S,~H,~L,~R,~I.Frame<S,Store,Resource,E>,~LV,~RV,~ordinary(~S,~Store,~Resource,~E,~H,~L,~LV,left),~ordinary(~S,~Store,~Resource,~E,~H,~R,~RV,right)),_=>P.pair(~Session.Owner<S,Store>,~S,~LV,~RV,~session(~S,~Store,~Resource,~E,~H,~L,~LV,left),~session(~S,~Store,~Resource,~E,~H,~R,~RV,right))}
51
52
53
54
55
56
57
58
59def finish(~S:Data,~Store:Type,~R:Type,~E:Data,~H:Type,~G:Type,~V:Data,~builder:Builder<S,Store,R,E,H,G,V>) -> O.Declaration<S,H,G,I.Frame<S,Store,R,E>,V>:
60 O.PreparedDeclaration{_=>O.operational(~S,~H,~G,~I.Frame<S,Store,R,E>,~V,ordinary(~S,~Store,~R,~E,~H,~G,~V,builder)),_=>O.inspection(~S,~H,~G,~I.Frame<S,Store,R,E>,~V,ordinary(~S,~Store,~R,~E,~H,~G,~V,builder)),owner=>Session.enumerate(~S,~Store,~R,~E,~V,~session(~S,~Store,~R,~E,~H,~G,~V,builder),owner)}
61
62
63
64
65def replace_operational(~S:Data,~Store:Type,~R:Type,~E:Data,~H:Type,~Old:Type,~New:Type,~V:Data,~operation:N.Declaration<S,H,New>,~builder:Builder<S,Store,R,E,H,Old,V>) -> Builder<S,Store,R,E,H,New,V>:
66 Builder{_=>O.Declaration{_=>operation,_=>O.inspection(~S,~H,~Old,~I.Frame<S,Store,R,E>,~V,ordinary(~S,~Store,~R,~E,~H,~Old,~V,builder))},_=>session(~S,~Store,~R,~E,~H,~Old,~V,builder)}