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))