ordinary_inspector_relation.bend
bendvy-ecs-core@0.1.0.0 · 61 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/relation_failure_reader.bend as Ord
3import bendvy-ecs-core@0.1.0.0/relation_types.bend as G
4import bendvy-ecs-core@0.1.0.0/relation_query.bend as RQ
5import bendvy-ecs-core@0.1.0.0/relation_commands.bend as A
6import bendvy-ecs-core@0.1.0.0/inspector.bend as I
7import bendvy-ecs-core@0.1.0.0/check.bend as K
8import bendvy-ecs-core@0.1.0.0/inspector_query.bend as Query
9import bendvy-ecs-core@0.1.0.0/inspector_query_projection.bend as Select
10import bendvy-ecs-core@0.1.0.0/inspector_relation_projection.bend as IR
11import bendvy-ecs-core@0.1.0.0/check_relation_projection.bend as CR
12
13# A closed ordinary relation declaration selects every relation clause.
14# Traversal, liveness and owner preservation remain in the existing projections.
15type Mode is Data:
16 RequiredOut{key:String}
17 OptionalOut{key:String}
18 PresentOut{}
19 AbsentOut{}
20 RequiredIn{key:String}
21 OptionalIn{key:String}
22 PresentIn{}
23 AbsentIn{}
24type Declaration<S:Data> is Data:
25 Declaration{source:Ord.Declaration<S>,mode:Mode}
26def descriptor(~S:Data,declaration:Ord.Declaration<S>) -> G.Descriptor<S>:
27 match declaration:
28 case Ord.Declaration{value}:value
29def selected_spec(~S:Data,source:Ord.Declaration<S>,mode:Mode) -> RQ.Spec<S>:
30 match mode:
31 case RequiredOut{key}:RQ.Spec{[RQ.read_relation(~S,key,descriptor(~S,source))]}
32 case OptionalOut{key}:RQ.Spec{[RQ.optional_relation(~S,key,descriptor(~S,source))]}
33 case PresentOut{}:RQ.Spec{[RQ.with_relation(~S,descriptor(~S,source))]}
34 case AbsentOut{}:RQ.Spec{[RQ.without_relation(~S,descriptor(~S,source))]}
35 case RequiredIn{key}:RQ.Spec{[RQ.read_related(~S,key,descriptor(~S,source))]}
36 case OptionalIn{key}:RQ.Spec{[RQ.optional_related(~S,key,descriptor(~S,source))]}
37 case PresentIn{}:RQ.Spec{[RQ.with_related(~S,descriptor(~S,source))]}
38 case AbsentIn{}:RQ.Spec{[RQ.without_related(~S,descriptor(~S,source))]}
39def spec(~S:Data,declaration:Declaration<S>) -> RQ.Spec<S>:
40 match declaration:
41 case Declaration{source,mode}:selected_spec(~S,source,mode)
42def required_out(~S:Data,key:String,declaration:Ord.Declaration<S>) -> Declaration<S>:
43 Declaration{declaration,RequiredOut{key}}
44def optional_out(~S:Data,key:String,declaration:Ord.Declaration<S>) -> Declaration<S>:
45 Declaration{declaration,OptionalOut{key}}
46def present_out(~S:Data,declaration:Ord.Declaration<S>) -> Declaration<S>:
47 Declaration{declaration,PresentOut{}}
48def absent_out(~S:Data,declaration:Ord.Declaration<S>) -> Declaration<S>:
49 Declaration{declaration,AbsentOut{}}
50def required_in(~S:Data,key:String,declaration:Ord.Declaration<S>) -> Declaration<S>:
51 Declaration{declaration,RequiredIn{key}}
52def optional_in(~S:Data,key:String,declaration:Ord.Declaration<S>) -> Declaration<S>:
53 Declaration{declaration,OptionalIn{key}}
54def present_in(~S:Data,declaration:Ord.Declaration<S>) -> Declaration<S>:
55 Declaration{declaration,PresentIn{}}
56def absent_in(~S:Data,declaration:Ord.Declaration<S>) -> Declaration<S>:
57 Declaration{declaration,AbsentIn{}}
58def inspect(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~component:Select.DeclaredSelection<I.Frame<S,A.Store<S,C>,R,A.Notice<S,E>>,S,V>,~declaration:Declaration<S>) -> Query.ComposedReadQuery<I.Frame<S,A.Store<S,C>,R,A.Notice<S,E>>,S,Select.Product<V,List<&2,RQ.Cell<S>>>>:
59 IR.grant(~S,~C,~R,~E,~V,~component,~spec(~S,declaration))
60def condition(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~component:Select.DeclaredSelection<K.Frame<S,A.Store<S,C>,R,A.Notice<S,E>>,S,V>,~declaration:Declaration<S>) -> Query.ComposedReadQuery<K.Frame<S,A.Store<S,C>,R,A.Notice<S,E>>,S,Select.Product<V,List<&2,RQ.Cell<S>>>>:
61 CR.grant(~S,~C,~R,~E,~V,~component,~spec(~S,declaration))