execution_resource_recipe.bend

bendvy-ecs-core@0.1.0.3 · 57 lines · 13 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/execution_composer_layout.bend as L
3import bendvy-ecs-core@0.1.0.3/execution_query_schema.bend as Routes
4
5type Permission is Data:
6  Unused{}
7  ReadOnly{}
8  Writable{}
9type Entry is Data:
10  Entry{route:L.Route,key:String,permission:Permission}
11type Book<-S:Data,-full:L.Layout> is Data:
12  Book{entries:List<&2,Entry>}
13def combine(left:Permission,right:Permission) -> Permission:
14  match left right:
15    case Writable{} _:Writable{}
16    case _ Writable{}:Writable{}
17    case ReadOnly{} _:ReadOnly{}
18    case _ ReadOnly{}:ReadOnly{}
19    case _ _:Unused{}
20def at_entry(permission:Permission,next:Permission,selected:Bool) -> Permission:
21  match selected:
22    case True{}:combine(permission,next)
23    case False{}:next
24def at(+route:L.Route,entries:List<&2,Entry>) -> Permission:
25  match entries:
26    case []:Unused{}
27    case Entry{selected,_,permission} <> rest:at_entry(permission,at(route,rest),Routes.same_route(route,selected))
28def valid(~full:L.Layout,entries:List<&2,Entry>) -> Bool:
29  match entries:
30    case []:True{}
31    case Entry{+route,key,_} <> rest:Bool.and(L.valid(full,route),Bool.and(String.eq(L.key(full,route),key),valid(~full,rest)))
32def conflict(left:Permission,right:Permission) -> Bool:
33  match left right:
34    case Unused{} _:False{}
35    case _ Unused{}:False{}
36    case ReadOnly{} ReadOnly{}:False{}
37    case _ _:True{}
38def conflicts(+right:List<&2,Entry>,left:List<&2,Entry>) -> Bool:
39  match left:
40    case []:False{}
41    case Entry{route,_,permission} <> rest:Bool.or(conflict(permission,at(route,right)),conflicts(right,rest))
42def compatible(~full:L.Layout,+left:List<&2,Entry>,+right:List<&2,Entry>) -> Bool:
43  Bool.and(L.unique(full),Bool.and(valid(~full,left),Bool.and(valid(~full,right),Bool.not(conflicts(right,left)))))
44def same(left:Permission,right:Permission) -> Bool:
45  match left right:
46    case Unused{} Unused{}:True{}
47    case ReadOnly{} ReadOnly{}:True{}
48    case Writable{} Writable{}:True{}
49    case _ _:False{}
50def writes(permission:Permission) -> Bool:
51  match permission:
52    case Writable{}:True{}
53    case _:False{}
54def uses(permission:Permission) -> Bool:
55  match permission:
56    case Unused{}:False{}
57    case _:True{}