1 import Base 2 import ./change_tick.bend as Tick 3 import ./world.bend as W 4 import ./compose.bend as Q 5 import ./capabilities.bend as Cap 6 import ./ordinary_query_declaration.bend as Decl 7 import ./ordinary_schema.bend as Schema 8 import ./owned_event_storage.bend as Storage 9 import ./owned_event_log.bend as Log 10 import ./owner_product.bend as Product 11 import ./resource_field.bend as Field 12 import ./transaction.bend as T 13 # Only the user resource is writable; the affine event log is a retained sibling. 14 def take(~R:Type,~P:Type,resources:Storage.Resources) -> Log.Log

& R: 15 match resources: 16 case Storage.Resources{resource,log}:(log,resource) 17 def put(~R:Type,~P:Type,log:Log.Log

,resource:R) -> Storage.Resources: 18 Storage.Resources{resource,log} 19 def lens(~R:Type,~P:Type) -> Product.Lens,R,Log.Log

>: 20 Product.Lens{take(~R,~P),put(~R,~P)} 21 def read_returned(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,handle:W.Handle,error:Maybe<&2,W.WorldError>,cursor:Maybe<&2,Tick.Tick>,result:T.Tx,Nat>,Nat> & V) -> Q.Frame,Nat> & V: 22 match result: 23 case (tx,value):(Q.Frame{tx,handle,error,cursor},value) 24 def read(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,~view:R -> R & V,owner:Q.Frame,Nat>) -> Q.Frame,Nat> & V: 25 match owner: 26 case Q.Frame{tx,handle,error,cursor}:read_returned(~S,~C,~R,~P,~V,handle,error,cursor,Cap.value_read(~T.Tx,Nat>,Nat>,~V,~Field.read(~S,~C,~Storage.Resources,~Nat,~R,~Log.Log

,~V,~lens(~R,~P),~view),tx)) 27 def set(~S:Data,~C:Type,~R:Type,~P:Type,owner:Q.Frame,Nat>,replacement:R) -> Q.Frame,Nat>: 28 match owner: 29 case Q.Frame{tx,handle,error,cursor}:Q.Frame{Field.tx_set(~S,~C,~Storage.Resources,~Nat,~R,~Log.Log

,~lens(~R,~P),tx,replacement),handle,error,cursor} 30 def selected(~S:Data,~C:Type,~R:Type,~P:Type,owner:Q.Frame,Nat>) -> Q.Frame,Nat> & Bool: 31 (owner,True{}) 32 def write(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,~identity:Schema.Resource,~view:R -> R & V) -> Decl.Declaration,Nat>,Cap.ValueWrite,Nat>,R,V>>: 33 Decl.Declaration{Cap.ValueWrite{read(~S,~C,~R,~P,~V,~view),set(~S,~C,~R,~P)},selected(~S,~C,~R,~P),[Decl.Clause{Schema.resource_key(~S,~R,identity),Decl.Write{}}]}