execution_query_domain.bend

bendvy-ecs-core@0.1.0.3 · 53 lines · 14 definitions

1import Base
2
3# Framework physical offsets, never public entity keys or gameplay authority.
4# Dynamic lists deliberately replace fixed-width masks and template row sets.
5type Domain is Data:
6  Domain{offsets:List<&2,U32>}
7type Validation is Data:
8  Valid{}
9  Duplicate{offset:U32}
10  OutOfBounds{offset:U32,capacity:U32}
11type Access is Data:
12  Access{reads:Domain,writes:Domain}
13
14def contains_list(+offset:U32,offsets:List<&2,U32>) -> Bool:
15  match offsets:
16    case []:False{}
17    case +head <> tail:Bool.or(U32.is_eq(offset,head),contains_list(offset,tail))
18def contains(domain:Domain,offset:U32) -> Bool:
19  match domain:
20    case Domain{offsets}:contains_list(offset,offsets)
21def validate_tail(+capacity:U32,+offset:U32,next:Validation,duplicate:Bool,inRange:Bool) -> Validation:
22  match duplicate inRange:
23    case True{} _:Duplicate{offset}
24    case False{} False{}:OutOfBounds{offset,capacity}
25    case False{} True{}:next
26def validate_list(+capacity:U32,offsets:List<&2,U32>) -> Validation:
27  match offsets:
28    case []:Valid{}
29    case +head <> +tail:validate_tail(capacity,head,validate_list(capacity,tail),contains_list(head,tail),U32.is_lt(head,capacity))
30def validate(capacity:U32,domain:Domain) -> Validation:
31  match domain:
32    case Domain{offsets}:validate_list(capacity,offsets)
33def intersects_list(+right:Domain,offsets:List<&2,U32>) -> Bool:
34  match offsets:
35    case []:False{}
36    case head <> rest:Bool.or(contains(right,head),intersects_list(right,rest))
37def intersects(left:Domain,right:Domain) -> Bool:
38  match left:
39    case Domain{offsets}:intersects_list(right,offsets)
40def insert(+domain:Domain,+offset:U32,present:Bool) -> Domain:
41  match domain present:
42    case domain True{}:domain
43    case Domain{offsets} False{}:Domain{offset <> offsets}
44def union_list(offsets:List<&2,U32>,+result:Domain) -> Domain:
45  match offsets:
46    case []:result
47    case +offset <> rest:union_list(rest,insert(result,offset,contains(result,offset)))
48def union(left:Domain,right:Domain) -> Domain:
49  match left:
50    case Domain{offsets}:union_list(offsets,right)
51def conflicts(left:Access,right:Access) -> Bool:
52  match left right:
53    case Access{+lr,+lw} Access{+rr,+rw}:Bool.or(intersects(lw,rw),Bool.or(intersects(lw,rr),intersects(rw,lr)))