inspector_metadata.bend

bendvy-ecs-core@0.1.0.0 · 58 lines · 0 definitions

1import Base
2import schedule_provision.bend as Provision
3
4# Trusted declaration metadata carries no provider, World or callback grant.
5type Resource<S:Data> is Data:
6  Resource{id:U32,name:String}
7type Metadata<S:Data> is Data:
8  Metadata{name:String,requirements:List<&2,Resource<S>>}
9type Definition<-S:Data,-Plan:Type> is Type:
10  Definition{metadata:Metadata<S>,plan:Plan}
11
12def token(~S:Data,value:Resource<S>) -> Provision.Requirement<S>:
13  match value:
14    case Resource{id,_}:Provision.Resource{id}
15def tokens(~S:Data,values:List<&2,Resource<S>>) -> List<&2,Provision.Requirement<S>>:
16  match values:
17    case []:[]
18    case value <> rest:token(~S,value) <> tokens(~S,rest)
19def choose_first(~S:Data,matched:Bool,value:Resource<S>,alternative:Maybe<&2,Resource<S>>) -> Maybe<&2,Resource<S>>:
20  match matched:
21    case True{}:Some{value}
22    case False{}:alternative
23def first(~S:Data,+id:U32,values:List<&2,Resource<S>>) -> Maybe<&2,Resource<S>>:
24  match values:
25    case []:None{}
26    case +value <> rest:
27      match value:
28        case Resource{key,_}:
29          choose_first(~S,U32.is_eq(id,key),value,first(~S,id,rest))
30def keep(~S:Data,value:Maybe<&2,Resource<S>>,rest:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
31  match value:
32    case None{}:rest
33    case Some{value}:value <> rest
34# Internal keys are lowered exclusively from Resource; wider provision token
35# cases have no source entry and confer no category/provider capability.
36def names(~S:Data,keys:List<&2,Provision.Requirement<S>>,+values:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
37  match keys:
38    case []:[]
39    case Provision.Resource{id} <> rest:keep(~S,first(~S,id,values),names(~S,rest,values))
40    case _ <> rest:names(~S,rest,values)
41def normalize(~S:Data,+values:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
42  names(~S,Provision.unique(~S,tokens(~S,values)),values)
43def make(~S:Data,~Plan:Type,name:String,requirements:List<&2,Resource<S>>,plan:Plan) -> Definition<S,Plan>:
44  Definition{Metadata{name,normalize(~S,requirements)},plan}
45def read(~S:Data,~Plan:Type,definition:Definition<S,Plan>) -> Definition<S,Plan> & Metadata<S>:
46  match definition:
47    case Definition{+metadata,plan}:(Definition{metadata,plan},metadata)
48def into_plan(~S:Data,~Plan:Type,definition:Definition<S,Plan>) -> Plan:
49  match definition:
50    case Definition{_,plan}:plan
51def kind(~S:Data,metadata:Metadata<S>) -> String:
52  "inspector"
53def name(~S:Data,metadata:Metadata<S>) -> String:
54  match metadata:
55    case Metadata{name,_}:name
56def requirements(~S:Data,metadata:Metadata<S>) -> List<&2,Resource<S>>:
57  match metadata:
58    case Metadata{_,requirements}:requirements