ordinary_owned_event_resource.bend

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

1import Base
2import bendvy-ecs-core@0.1.0.0/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.0/world.bend as W
4import bendvy-ecs-core@0.1.0.0/compose.bend as Q
5import bendvy-ecs-core@0.1.0.0/capabilities.bend as Cap
6import bendvy-ecs-core@0.1.0.0/ordinary_query_declaration.bend as Decl
7import bendvy-ecs-core@0.1.0.0/ordinary_schema.bend as Schema
8import bendvy-ecs-core@0.1.0.0/owned_event_storage.bend as Storage
9import bendvy-ecs-core@0.1.0.0/owned_event_log.bend as Log
10import bendvy-ecs-core@0.1.0.0/owner_product.bend as Product
11import bendvy-ecs-core@0.1.0.0/resource_field.bend as Field
12import bendvy-ecs-core@0.1.0.0/transaction.bend as T
13# Only the user resource is writable; the affine event log is a retained sibling.
14def take(~R:Type,~P:Type,resources:Storage.Resources<R,P>) -> Log.Log<P> & R:
15  match resources:
16    case Storage.Resources{resource,log}:(log,resource)
17def put(~R:Type,~P:Type,log:Log.Log<P>,resource:R) -> Storage.Resources<R,P>:
18  Storage.Resources{resource,log}
19def lens(~R:Type,~P:Type) -> Product.Lens<Storage.Resources<R,P>,R,Log.Log<P>>:
20  Product.Lens{take(~R,~P),put(~R,~P)}
21def read_returned(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,handle:W.Handle<S>,error:Maybe<&2,W.WorldError>,cursor:Maybe<&2,Tick.Tick>,result:T.Tx<W.World<S,C,Storage.Resources<R,P>,Nat>,Nat> & V) -> Q.Frame<S,C,Storage.Resources<R,P>,Nat> & V:
22  match result:
23    case (tx,value):(Q.Frame{tx,handle,error,cursor},value)
24def read(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,~view:R -> R & V,owner:Q.Frame<S,C,Storage.Resources<R,P>,Nat>) -> Q.Frame<S,C,Storage.Resources<R,P>,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<W.World<S,C,Storage.Resources<R,P>,Nat>,Nat>,~V,~Field.read(~S,~C,~Storage.Resources<R,P>,~Nat,~R,~Log.Log<P>,~V,~lens(~R,~P),~view),tx))
27def set(~S:Data,~C:Type,~R:Type,~P:Type,owner:Q.Frame<S,C,Storage.Resources<R,P>,Nat>,replacement:R) -> Q.Frame<S,C,Storage.Resources<R,P>,Nat>:
28  match owner:
29    case Q.Frame{tx,handle,error,cursor}:Q.Frame{Field.tx_set(~S,~C,~Storage.Resources<R,P>,~Nat,~R,~Log.Log<P>,~lens(~R,~P),tx,replacement),handle,error,cursor}
30def selected(~S:Data,~C:Type,~R:Type,~P:Type,owner:Q.Frame<S,C,Storage.Resources<R,P>,Nat>) -> Q.Frame<S,C,Storage.Resources<R,P>,Nat> & Bool:
31  (owner,True{})
32def write(~S:Data,~C:Type,~R:Type,~P:Type,~V:Data,~identity:Schema.Resource<S,R>,~view:R -> R & V) -> Decl.Declaration<S,Q.Frame<S,C,Storage.Resources<R,P>,Nat>,Cap.ValueWrite<Q.Frame<S,C,Storage.Resources<R,P>,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{}}]}