1 import Base 2 import ./ordinary_removal_provision.bend as Provision 3 import ./ordinary_declaration.bend as Identity 4 import ./ordinary_component_binding.bend as Binding 5 import ./column.bend as Col 6 import ./world.bend as W 7 import ./removals.bend as Rm 8 import ./capabilities.bend as Cap 9 10 type Mode is Data: 11 Read{} 12 Write{} 13 type Declaration is Data: 14 Declaration{identity:Identity.Declaration,mode:Mode} 15 def read(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,binding:Binding.Binding) -> Declaration: 16 Declaration{Binding.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),Read{}} 17 def write(~S:Data,~Store:Type,~Rest:Type,~P:Type,~V:Data,~Token:Data,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~view:P -> P & V,binding:Binding.Binding) -> Declaration: 18 Declaration{Binding.identity(~S,~Store,~Rest,~P,~V,~Token,~take,~put,~view,binding),Write{}} 19 def record_checked(~S:Data,~P:Type,allowed:Bool,+key:String,+handle:W.Handle,+identity:Identity.Declaration,rest:List<&2,Rm.Record>>) -> List<&2,Rm.Record>>: 20 match allowed: 21 case True{}:Rm.Removed{handle,identity} <> rest 22 case False{}:rest 23 def records(~S:Data,~P:Type,+key:String,values:List<&2,Rm.Record>>) -> List<&2,Rm.Record>>: 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) 28 def viewed(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~select:E -> Maybe<&2,Rm.Record>>,key:String,view:W.World & List<&2,E>) -> W.World & Maybe<&2,List<&2,Rm.Record>>>: 29 (world,values)=view 30 (world,Some{records(~S,~P,key,Rm.since(~S,~E,~Identity.Declaration,~select,values,0n))}) 31 def checked(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~select:E -> Maybe<&2,Rm.Record>>,allowed:Bool,key:String,world:W.World) -> W.World & Maybe<&2,List<&2,Rm.Record>>>: 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)) 35 def get(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~inject:Identity.Declaration -> W.Handle -> E,~select:E -> Maybe<&2,Rm.Record>>,declaration:Declaration,selection:Provision.Selection,world:W.World) -> W.World & Maybe<&2,List<&2,Rm.Record>>>: 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) 41 def bind(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~inject:Identity.Declaration -> W.Handle -> E,~select:E -> Maybe<&2,Rm.Record>>,declaration:Declaration,selection:Provision.Selection) -> Cap.ValueRead,Maybe<&2,List<&2,Rm.Record>>>>: 42 Cap.ValueRead{world => get(~S,~C,~R,~E,~P,~inject,~select,declaration,selection,world)}