ordinary_machine_declaration.bend
bendvy-ecs-core@0.1.0.4 · 68 lines · 11 definitions
1import Base
2import bendvy-ecs-core@0.1.0.4/machine_world.bend as MW
3import bendvy-ecs-core@0.1.0.4/machine.bend as M
4import bendvy-ecs-core@0.1.0.4/world.bend as W
5import bendvy-ecs-core@0.1.0.4/inspector.bend as I
6import bendvy-ecs-core@0.1.0.4/check.bend as K
7import bendvy-ecs-core@0.1.0.4/capabilities.bend as Cap
8import bendvy-ecs-core@0.1.0.4/inspector_machine_projection.bend as P
9
10
11
12
13
14
15
16type Declaration<-S:Data,-Token:Data,-V:Data,-R:Type,-take:R -> R & M.Slot<S,Token,V>> is Data:
17 Declaration{name:String}
18 Vocabulary{name:String,values:List<&2,V>}
19
20def name(~S:Data,~Token:Data,~V:Data,~R:Type,~take:R -> R & M.Slot<S,Token,V>,declaration:Declaration<S,Token,V,R,take>) -> String:
21 match declaration:
22 case Declaration{name}:name
23 case Vocabulary{name,_}:name
24
25
26
27
28
29def declared(~S:Data,~Token:Data,~V:Data,~R:Type,~take:R -> R & M.Slot<S,Token,V>,name:String,values:List<&2,V>) -> Declaration<S,Token,V,R,take>:
30 Vocabulary{name,values}
31
32
33def values(~S:Data,~Token:Data,~V:Data,~R:Type,~take:R -> R & M.Slot<S,Token,V>,declaration:Declaration<S,Token,V,R,take>) -> Maybe<&2,List<&2,V>>:
34 match declaration:
35 case Declaration{_}:None{}
36 case Vocabulary{_,values}:Some{values}
37
38
39
40def inspect(~S:Data,~Token:Data,~V:Data,~C:Type,~R:Type,~E:Data,~take:R -> R & M.Slot<S,Token,V>,~declaration:Declaration<S,Token,V,R,take>) -> Cap.ValueRead<I.Frame<S,C,R,E>,M.CurrentView<S,Token,V>>:
41 P.provide(~S,~Token,~V,~C,~R,~E,~take)
42
43
44def condition(~S:Data,~Token:Data,~V:Data,~C:Type,~R:Type,~E:Data,~take:R -> R & M.Slot<S,Token,V>,~declaration:Declaration<S,Token,V,R,take>) -> Cap.ValueRead<K.Frame<S,C,R,E>,M.CurrentView<S,Token,V>>:
45 P.check_provide(~S,~Token,~V,~C,~R,~E,~take)
46
47
48def availability(~S:Data,~Token:Data,~V:Data,~C:Type,~R:Type,~E:Data,name:String,observed:W.World<S,C,R,E> & M.Slot<S,Token,V>) -> W.World<S,C,R,E> & List<&2,String>:
49 match observed:
50 case (world,M.Missing{}):(world,[name])
51 case (world,M.Present{_,_,_,_}):(world,[])
52
53
54
55def required(~S:Data,~Token:Data,~V:Data,~C:Type,~R:Type,~E:Data,~take:R -> R & M.Slot<S,Token,V>,~declaration:Declaration<S,Token,V,R,take>,world:W.World<S,C,R,E>) -> W.World<S,C,R,E> & List<&2,String>:
56 availability(~S,~Token,~V,~C,~R,~E,name(~S,~Token,~V,~R,~take,declaration),MW.take(~S,~Token,~V,~C,~R,~E,~take,world))
57
58
59def get(~H:Type,~S:Data,~Token:Data,~V:Data,~cap:Cap.ValueRead<H,M.CurrentView<S,Token,V>>,owner:H) -> H & M.CurrentView<S,Token,V>:
60 Cap.value_read(~H,~M.CurrentView<S,Token,V>,~cap,owner)
61def compared(~H:Type,~S:Data,~Token:Data,~V:Data,~same:V -> V -> Bool,value:V,observed:H & M.CurrentView<S,Token,V>) -> H & Bool:
62 (owner,view)=observed
63 (owner,M.is_current(~S,~Token,~V,~same,view,value))
64
65
66
67def matches(~H:Type,~S:Data,~Token:Data,~V:Data,~same:V -> V -> Bool,~cap:Cap.ValueRead<H,M.CurrentView<S,Token,V>>,owner:H,value:V) -> H & Bool:
68 compared(~H,~S,~Token,~V,~same,value,get(~H,~S,~Token,~V,~cap,owner))