recognized_query_declaration.bend
bendvy-ecs-core@0.1.0.4 · 78 lines · 10 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/compose.bend as Q
3import bendvy-ecs-core@0.1.0.4/ordinary_query_declaration.bend as N
4import bendvy-ecs-core@0.1.0.4/internal/compact_operational_frame.bend as F
5import bendvy-ecs-core@0.1.0.4/ordinary_component_binding.bend as B
6import bendvy-ecs-core@0.1.0.4/column.bend as Col
7import bendvy-ecs-core@0.1.0.4/component.bend as C
8import bendvy-ecs-core@0.1.0.4/capabilities.bend as Cap
9import bendvy-ecs-core@0.1.0.4/ordinary_schema.bend as Schema
10import bendvy-ecs-core@0.1.0.4/ordinary_owned_event_family_resource.bend as Resource
11import bendvy-ecs-core@0.1.0.4/owner_product.bend as Product
12
13
14
15
16
17
18
19
20
21
22
23type Declaration<-S:Data,-Store:Type,-R:Type,-E:Data,-Ops:Type -> Type> is Type:
24 Declaration{legacy:Unit -> N.Declaration<S,Q.Frame<S,Store,R,E>,Ops(Q.Frame<S,Store,R,E>)>,caps:Unit -> Ops(F.Frame<S,Store,R,E>),select:F.Frame<S,Store,R,E> -> F.Frame<S,Store,R,E> & Bool}
25
26
27
28def ordinary(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,declaration:Declaration<S,Store,R,E,Ops>) -> N.Declaration<S,Q.Frame<S,Store,R,E>,Ops(Q.Frame<S,Store,R,E>)>:
29 match declaration:
30 case Declaration{legacy,_,_}:legacy(Unit{})
31
32
33
34def caps(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,declaration:Declaration<S,Store,R,E,Ops>) -> Ops(F.Frame<S,Store,R,E>):
35 match declaration:
36 case Declaration{_,caps,_}:caps(Unit{})
37
38
39
40def selector(~S:Data,~Store:Type,~R:Type,~E:Data,~Ops:Type -> Type,declaration:Declaration<S,Store,R,E,Ops>) -> F.Frame<S,Store,R,E> -> F.Frame<S,Store,R,E> & Bool:
41 match declaration:
42 case Declaration{_,_,select}:select
43
44
45
46
47def write_caps(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,~binding:B.Binding<S,Store,Rest,P,V,Token,take,put,view>) -> Cap.Write<F.Frame<S,Store,R,E>,P,V>:
48 Cap.Write{F.read(~S,~Store,~R,~E,~Rest,~P,~V,~take,~put,~view),F.bridge_set(~S,~Store,~R,~E,~P,~Q.set(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~B.family(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding)))}
49
50
51
52
53
54def write(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,~binding:B.Binding<S,Store,Rest,P,V,Token,take,put,view>) -> Declaration<S,Store,R,E,H => Cap.Write<H,P,V>>:
55 Declaration{_=>N.write(~S,~P,~Store,~R,~E,~Rest,~V,~Token,~B.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),~view,~take,~put),_=>write_caps(~S,~Store,~R,~E,~Rest,~P,~V,~Token,~take,~put,~view,~binding),F.family_match(~S,~Store,~R,~E,~Rest,~P,~V,~take,~put,~view,~Q.Required{})}
56
57
58
59def resource_caps(~S:Data,~Store:Type,~R:Type,~Logs:Type,~E:Data,~V:Data,~view:R -> R & V) -> Cap.ValueWrite<F.Frame<S,Store,Product.Owner<R,Logs>,E>,R,V>:
60 Cap.ValueWrite{F.bridge_get(~S,~Store,~Product.Owner<R,Logs>,~E,~V,~Resource.read(~S,~Store,~R,~Logs,~E,~V,~view)),F.bridge_set(~S,~Store,~Product.Owner<R,Logs>,~E,~R,~Resource.set(~S,~Store,~R,~Logs,~E))}
61
62
63
64
65
66def resource_write(~S:Data,~Store:Type,~R:Type,~Logs:Type,~E:Data,~V:Data,~identity:Schema.Resource<S,R>,~view:R -> R & V) -> Declaration<S,Store,Product.Owner<R,Logs>,E,H => Cap.ValueWrite<H,R,V>>:
67 Declaration{_=>Resource.write(~S,~Store,~R,~Logs,~E,~V,~identity,~view),_=>resource_caps(~S,~Store,~R,~Logs,~E,~V,~view),F.all(~S,~Store,~Product.Owner<R,Logs>,~E)}
68
69
70def pair_caps(~S:Data,~Store:Type,~R:Type,~E:Data,~L:Type -> Type,~Right:Type -> Type,~left:Declaration<S,Store,R,E,L>,~right:Declaration<S,Store,R,E,Right>) -> L(F.Frame<S,Store,R,E>) & Right(F.Frame<S,Store,R,E>):
71 (caps(~S,~Store,~R,~E,~L,left),caps(~S,~Store,~R,~E,~Right,right))
72
73
74
75
76
77def pair(~S:Data,~Store:Type,~R:Type,~E:Data,~L:Type -> Type,~Right:Type -> Type,~left:Declaration<S,Store,R,E,L>,~right:Declaration<S,Store,R,E,Right>) -> Declaration<S,Store,R,E,H => L(H) & Right(H)>:
78 Declaration{_=>N.pair(~S,~Q.Frame<S,Store,R,E>,~L(Q.Frame<S,Store,R,E>),~Right(Q.Frame<S,Store,R,E>),~ordinary(~S,~Store,~R,~E,~L,left),~ordinary(~S,~Store,~R,~E,~Right,right)),_=>pair_caps(~S,~Store,~R,~E,~L,~Right,~left,~right),F.both(~S,~Store,~R,~E,~selector(~S,~Store,~R,~E,~L,left),~selector(~S,~Store,~R,~E,~Right,right))}