1 import Base 2 import ./execution_composer_layout.bend as L 3 import ./execution_query_matches.bend as Match 4 5 type QueryKind is Data: 6 ReadRows{} 7 WriteRows{} 8 type Bound is Data: 9 AllLive{} 10 With{route:L.Route} 11 Without{route:L.Route} 12 # Bevy Changed compares component ticks with last_run/this_run: 13 # https://github.com/bevyengine/bevy/blob/ad678262ce53b5d142fe49ee5e08caff6f00ab60/crates/bevy_ecs/src/query/filter.rs 14 # Admission reserves an upper bound; each operation checks actual stamps. 15 Changed{route:L.Route} 16 And{left:Bound,right:Bound} 17 Or{left:Bound,right:Bound} 18 # Symbolic declaration only. Physical domains do not exist until admission 19 # inspects actual full-World handles/storage; predicates are operation-local. 20 type Entry is Data: 21 Entry{route:L.Route,kind:QueryKind,bound:Bound,presence:Match.Presence} 22 type Recipe<-S:Data,-WC:Type> is Data: 23 Recipe{entry:Entry} 24 def brand(-S:Data,-WC:Type,entries:List<&2,Entry>) -> List<&2,Recipe>: 25 match entries: 26 case []:[] 27 case entry <> rest:Recipe{entry} <> brand(S,WC,rest) 28 def bound_valid(~full:L.Layout,bound:Bound) -> Bool: 29 match bound: 30 case AllLive{}:True{} 31 case With{route}:L.valid(full,route) 32 case Without{route}:L.valid(full,route) 33 case Changed{route}:L.valid(full,route) 34 case And{left,right}:Bool.and(bound_valid(~full,left),bound_valid(~full,right)) 35 case Or{left,right}:Bool.and(bound_valid(~full,left),bound_valid(~full,right))