execution_relation_resource_snapshot.bend

bendvy-ecs-core@0.1.0.3 · 29 lines · 8 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/execution_composer_layout.bend as Layout
3import bendvy-ecs-core@0.1.0.3/execution_resource_policy.bend as Policy
4import bendvy-ecs-core@0.1.0.3/execution_relation_resource_publication.bend as Cast
5import bendvy-ecs-core@0.1.0.3/execution_relation_store.bend as Store
6import bendvy-ecs-core@0.1.0.3/relation_types.bend as T
7
8type GraphView<-S:Data> is Data:
9  GraphView{route:Layout.Route,descriptor:T.Descriptor<S>,namespace:U32,graph:T.Graph<S>}
10def Program(~S:Data,~resources:Layout.Layout) -> Type:
11  Layout.resources(~S,resources) -> Layout.resources(~S,resources) & List<&2,GraphView<S>>
12def empty(~S:Data,~resources:Layout.Layout,owners:Layout.resources(~S,resources)) -> Layout.resources(~S,resources) & List<&2,GraphView<S>>:
13  (owners,[])
14def observed(~S:Data,~descriptor:T.Descriptor<S>,~key:String,~origin:Layout.Layout,route:Layout.Route,slot:Layout.ResourceSlot<S,Layout.Viewed<Store.Store<S,descriptor>,Store.View<S,descriptor>>,key,origin>) -> Layout.ResourceSlot<S,Layout.Viewed<Store.Store<S,descriptor>,Store.View<S,descriptor>>,key,origin> & GraphView<S>:
15  match slot:
16    case Layout.ResourceSlot{Layout.Viewed{Store.Store{+namespace,+graph,failures,sequence,nextReader},cache},stamp}:(Layout.ResourceSlot{Layout.Viewed{Store.Store{namespace,graph,failures,sequence,nextReader},cache},stamp},GraphView{route,descriptor,namespace,graph})
17def restored(~S:Data,~resources:Layout.Layout,~route:Layout.Route,~descriptor:T.Descriptor<S>,~payload:{Layout.payload(resources,route) == Store.Store<S,descriptor> : Type},~view:{Layout.view(resources,route) == Store.View<S,descriptor> : Data},previous:List<&2,GraphView<S>>,rest:Layout.resource_rest(~S,resources,route),result:Layout.ResourceSlot<S,Layout.Viewed<Store.Store<S,descriptor>,Store.View<S,descriptor>>,Layout.key(resources,route),Layout.origin(resources,route)> & GraphView<S>) -> Layout.resources(~S,resources) & List<&2,GraphView<S>>:
18  match result:
19    case (slot,seen):(Layout.resource_put(~S,resources,route,rest,Cast.slot(~S,~Layout.key(resources,route),~Layout.origin(resources,route),~Store.Store<S,descriptor>,~Layout.payload(resources,route),~Store.View<S,descriptor>,~Layout.view(resources,route),Equal.sym(Type,Layout.payload(resources,route),Store.Store<S,descriptor>,payload),Equal.sym(Data,Layout.view(resources,route),Store.View<S,descriptor>,view),slot)),seen <> previous)
20def selected(~S:Data,~resources:Layout.Layout,~route:Layout.Route,~descriptor:T.Descriptor<S>,~payload:{Layout.payload(resources,route) == Store.Store<S,descriptor> : Type},~view:{Layout.view(resources,route) == Store.View<S,descriptor> : Data},previous:List<&2,GraphView<S>>,result:Layout.resource_rest(~S,resources,route) & Layout.ResourceSlot<S,Layout.stored(resources,route),Layout.key(resources,route),Layout.origin(resources,route)>) -> Layout.resources(~S,resources) & List<&2,GraphView<S>>:
21  match result:
22    case (rest,slot):restored(~S,~resources,~route,~descriptor,~payload,~view,previous,rest,observed(~S,~descriptor,~Layout.key(resources,route),~Layout.origin(resources,route),route,Cast.slot(~S,~Layout.key(resources,route),~Layout.origin(resources,route),~Layout.payload(resources,route),~Store.Store<S,descriptor>,~Layout.view(resources,route),~Store.View<S,descriptor>,payload,view,slot)))
23def gathered(~S:Data,~resources:Layout.Layout,~route:Layout.Route,~descriptor:T.Descriptor<S>,~payload:{Layout.payload(resources,route) == Store.Store<S,descriptor> : Type},~view:{Layout.view(resources,route) == Store.View<S,descriptor> : Data},result:Layout.resources(~S,resources) & List<&2,GraphView<S>>) -> Layout.resources(~S,resources) & List<&2,GraphView<S>>:
24  match result:
25    case (owners,previous):selected(~S,~resources,~route,~descriptor,~payload,~view,previous,Layout.resource_take(~S,resources,route,owners))
26# A closed grant extends this observer beside its mutating dispatcher. It never
27# grants gameplay access to the graph owner, failure channel or resource lens.
28def extend(~S:Data,~resources:Layout.Layout,~route:Layout.Route,~descriptor:T.Descriptor<S>,~payload:{Layout.payload(resources,route) == Store.Store<S,descriptor> : Type},~view:{Layout.view(resources,route) == Store.View<S,descriptor> : Data},~protected:{Layout.policy(resources,route) == Policy.ProtectedRelation{S,descriptor} : Policy.Policy},previous:Program(~S,~resources)) -> Program(~S,~resources):
29  owners => gathered(~S,~resources,~route,~descriptor,~payload,~view,previous(owners))