inspector_query_families.bend
bendvy-ecs-core@0.1.0.1 · 72 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/change_tick.bend as Tick
3import inspector_query_projection.bend as Q
4import inspector.bend as I
5import check.bend as K
6import world.bend as W
7import component.bend as C
8import column.bend as Col
9import compose.bend as P
10import lifecycle.bend as L
11
12# Closed nominal-family adapters; Check has no cursor/lifecycle factory.
13type SlotMode is Data:
14 Required{}
15 Optional{}
16def slot_mode(value:SlotMode) -> P.Selection:
17 match value:
18 case Required{}:P.Required{}
19 case Optional{}:P.Optional{}
20def inspect_joined(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,cursor:Maybe<&2,Tick.Tick>,observed:W.World<S,Store,R,E> & C.Access<V>) -> I.Frame<S,Store,R,E> & C.Access<V>:
21 (world,value)=observed
22 (I.Frame{world,cursor},value)
23def inspect_read(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,frame:I.Frame<S,Store,R,E>,+target:W.Handle<S>) -> I.Frame<S,Store,R,E> & C.Access<V>:
24 match frame:
25 case I.Frame{world,cursor}:inspect_joined(~S,~Store,~R,~E,~V,cursor,C.get_allowed(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,W.valid(~S,~Store,~R,~E,world,target),target))
26def inspect_matched(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,mode:P.Selection,observed:I.Frame<S,Store,R,E> & C.Access<V>) -> I.Frame<S,Store,R,E> & Bool:
27 (frame,value)=observed
28 (frame,P.selected_value(~V,mode,value))
29# Membership uses the built-in identity-preserving presence projection.
30def inspect_presence(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,frame:I.Frame<S,Store,R,E>,+target:W.Handle<S>) -> I.Frame<S,Store,R,E> & C.Access<Bool>:
31 match frame:
32 case I.Frame{world,cursor}:inspect_joined(~S,~Store,~R,~E,~Bool,cursor,C.get_allowed(~S,~Store,~R,~E,~Rest,~Payload,~Bool,~Token,~take,~put,~Col.present(~Payload),W.valid(~S,~Store,~R,~E,world,target),target))
33def inspect_matches(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:P.Selection,frame:I.Frame<S,Store,R,E>,target:W.Handle<S>) -> I.Frame<S,Store,R,E> & Bool:
34 inspect_matched(~S,~Store,~R,~E,~Bool,mode,inspect_presence(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,frame,target))
35def inspect_slot(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:SlotMode) -> Q.DeclaredSelection<I.Frame<S,Store,R,E>,S,C.Access<V>>:
36 Q.DeclaredSelection{frame => target => inspect_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~slot_mode(mode),frame,target),frame => target => inspect_read(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,frame,target)}
37def inspect_with(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>) -> Q.Predicate<I.Frame<S,Store,R,E>,S>:
38 Q.Predicate{frame => target => inspect_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~P.Present{},frame,target)}
39def inspect_without(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>) -> Q.Predicate<I.Frame<S,Store,R,E>,S>:
40 Q.Predicate{frame => target => inspect_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~P.Absent{},frame,target)}
41def check_joined(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,observed:W.World<S,Store,R,E> & C.Access<V>) -> K.Frame<S,Store,R,E> & C.Access<V>:
42 (world,value)=observed
43 (K.Frame{world},value)
44def check_read(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,frame:K.Frame<S,Store,R,E>,target:W.Handle<S>) -> K.Frame<S,Store,R,E> & C.Access<V>:
45 match frame:
46 case K.Frame{world}:check_joined(~S,~Store,~R,~E,~V,C.get(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,family,world,target))
47def check_matched(~S:Data,~Store:Type,~R:Type,~E:Data,~V:Data,mode:P.Selection,observed:K.Frame<S,Store,R,E> & C.Access<V>) -> K.Frame<S,Store,R,E> & Bool:
48 (frame,value)=observed
49 (frame,P.selected_value(~V,mode,value))
50# Membership uses the built-in identity-preserving presence projection.
51def check_presence(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,frame:K.Frame<S,Store,R,E>,+target:W.Handle<S>) -> K.Frame<S,Store,R,E> & C.Access<Bool>:
52 match frame:
53 case K.Frame{world}:check_joined(~S,~Store,~R,~E,~Bool,C.get_allowed(~S,~Store,~R,~E,~Rest,~Payload,~Bool,~Token,~take,~put,~Col.present(~Payload),W.valid(~S,~Store,~R,~E,world,target),target))
54def check_matches(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:P.Selection,frame:K.Frame<S,Store,R,E>,target:W.Handle<S>) -> K.Frame<S,Store,R,E> & Bool:
55 check_matched(~S,~Store,~R,~E,~Bool,mode,check_presence(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,frame,target))
56def check_slot(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:SlotMode) -> Q.DeclaredSelection<K.Frame<S,Store,R,E>,S,C.Access<V>>:
57 Q.DeclaredSelection{frame => target => check_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~slot_mode(mode),frame,target),frame => target => check_read(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,frame,target)}
58def check_with(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>) -> Q.Predicate<K.Frame<S,Store,R,E>,S>:
59 Q.Predicate{frame => target => check_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~P.Present{},frame,target)}
60def check_without(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>) -> Q.Predicate<K.Frame<S,Store,R,E>,S>:
61 Q.Predicate{frame => target => check_matches(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~P.Absent{},frame,target)}
62def lifecycle_clocked(~S:Data,~Store:Type,~R:Type,~E:Data,~mode:P.LifecycleSelection,+cursor:Maybe<&2,Tick.Tick>,stamp:L.Stamp,observed:W.World<S,Store,R,E> & Tick.Tick) -> I.Frame<S,Store,R,E> & Bool:
63 match observed:
64 case (world,this):(I.Frame{world,cursor},P.lifecycle_selected(mode,stamp,cursor,this))
65def lifecycle_join(~S:Data,~Store:Type,~R:Type,~E:Data,~mode:P.LifecycleSelection,+cursor:Maybe<&2,Tick.Tick>,observed:W.World<S,Store,R,E> & L.Stamp) -> I.Frame<S,Store,R,E> & Bool:
66 (world,stamp)=observed
67 lifecycle_clocked(~S,~Store,~R,~E,~mode,cursor,stamp,W.execution_clock(~S,~Store,~R,~E,world))
68def inspect_lifecycle(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:P.LifecycleSelection,frame:I.Frame<S,Store,R,E>,target:W.Handle<S>) -> I.Frame<S,Store,R,E> & Bool:
69 match frame:
70 case I.Frame{world,cursor}:lifecycle_join(~S,~Store,~R,~E,~mode,cursor,C.lifecycle(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,family,world,target))
71def inspect_filter(~S:Data,~Store:Type,~R:Type,~E:Data,~Rest:Type,~Payload:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,Payload>,~put:Rest -> Col.Column<S,Payload> -> Store,~project:Payload -> Payload & V,~family:C.Family<S,Store,Rest,Payload,V,Token,take,put,project>,~mode:P.LifecycleSelection) -> Q.Predicate<I.Frame<S,Store,R,E>,S>:
72 Q.both(~I.Frame<S,Store,R,E>,~S,~inspect_with(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family),~Q.Predicate{frame => target => inspect_lifecycle(~S,~Store,~R,~E,~Rest,~Payload,~V,~Token,~take,~put,~project,~family,~mode,frame,target)})