ordinary_inspector_removal.bend
bendvy-ecs-core@0.1.0.0 · 42 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/ordinary_removal_provision.bend as Provision
3import bendvy-ecs-core@0.1.0.0/ordinary_declaration.bend as Identity
4import bendvy-ecs-core@0.1.0.0/ordinary_component_binding.bend as Binding
5import bendvy-ecs-core@0.1.0.0/column.bend as Col
6import bendvy-ecs-core@0.1.0.0/world.bend as W
7import bendvy-ecs-core@0.1.0.0/removals.bend as Rm
8import bendvy-ecs-core@0.1.0.0/capabilities.bend as Cap
9
10type Mode is Data:
11 Read{}
12 Write{}
13type Declaration<S:Data,P:Type> is Data:
14 Declaration{identity:Identity.Declaration<S,P>,mode:Mode}
15def read(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,binding:Binding.Binding<S,Store,Rest,P,V,Token,take,put,view>) -> Declaration<S,P>:
16 Declaration{Binding.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),Read{}}
17def write(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~view:P -> P & V,binding:Binding.Binding<S,Store,Rest,P,V,Token,take,put,view>) -> Declaration<S,P>:
18 Declaration{Binding.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),Write{}}
19def record_checked(~S:Data,~P:Type,allowed:Bool,+key:String,+handle:W.Handle<S>,+identity:Identity.Declaration<S,P>,rest:List<&2,Rm.Record<S,Identity.Declaration<S,P>>>) -> List<&2,Rm.Record<S,Identity.Declaration<S,P>>>:
20 match allowed:
21 case True{}:Rm.Removed{handle,identity} <> rest
22 case False{}:rest
23def records(~S:Data,~P:Type,+key:String,values:List<&2,Rm.Record<S,Identity.Declaration<S,P>>>) -> List<&2,Rm.Record<S,Identity.Declaration<S,P>>>:
24 match values:
25 case []:[]
26 case Rm.Removed{+handle,+identity} <> rest:record_checked(~S,~P,String.eq(key,Identity.key(~S,~P,identity)),key,handle,identity,records(~S,~P,key,rest))
27 case Rm.Despawned{handle} <> rest:Rm.Despawned{handle} <> records(~S,~P,key,rest)
28def viewed(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~select:E -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,key:String,view:W.World<S,C,R,E> & List<&2,E>) -> W.World<S,C,R,E> & Maybe<&2,List<&2,Rm.Record<S,Identity.Declaration<S,P>>>>:
29 (world,values)=view
30 (world,Some{records(~S,~P,key,Rm.since(~S,~E,~Identity.Declaration<S,P>,~select,values,0n))})
31def checked(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~select:E -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,allowed:Bool,key:String,world:W.World<S,C,R,E>) -> W.World<S,C,R,E> & Maybe<&2,List<&2,Rm.Record<S,Identity.Declaration<S,P>>>>:
32 match allowed:
33 case False{}:(world,None{})
34 case True{}:viewed(~S,~C,~R,~E,~P,~select,key,W.events_view(~S,~C,~R,~E,world))
35def get(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> E,~select:E -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,declaration:Declaration<S,P>,selection:Provision.Selection<S,P,E,inject,select>,world:W.World<S,C,R,E>) -> W.World<S,C,R,E> & Maybe<&2,List<&2,Rm.Record<S,Identity.Declaration<S,P>>>>:
36 match declaration selection:
37 case Declaration{_,Write{}} _:(world,None{})
38 case Declaration{identity,Read{}} Provision.Selection{selected}:
39 +key=Identity.key(~S,~P,identity)
40 checked(~S,~C,~R,~E,~P,~select,String.eq(key,Identity.key(~S,~P,selected)),key,world)
41def bind(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~inject:Identity.Declaration<S,P> -> W.Handle<S> -> E,~select:E -> Maybe<&2,Rm.Record<S,Identity.Declaration<S,P>>>,declaration:Declaration<S,P>,selection:Provision.Selection<S,P,E,inject,select>) -> Cap.ValueRead<W.World<S,C,R,E>,Maybe<&2,List<&2,Rm.Record<S,Identity.Declaration<S,P>>>>>:
42 Cap.ValueRead{world => get(~S,~C,~R,~E,~P,~inject,~select,declaration,selection,world)}