execution_query_domain.bend
bendvy-ecs-core@0.1.0.3 · 53 lines · 14 definitions
1import Base
2
3
4
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)))