restore_graph_runtime_state.bend
bendvy-ecs-core@0.1.0.0 · 45 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/world_resource_owner.bend as WR
5import bendvy-ecs-core@0.1.0.0/owner_product.bend as Product
6import bendvy-ecs-core@0.1.0.0/event_family_runtime.bend as Family
7import bendvy-ecs-core@0.1.0.0/event_family_routing.bend as Route
8import bendvy-ecs-core@0.1.0.0/event_notice_runtime.bend as Mixed
9import bendvy-ecs-core@0.1.0.0/owned_event_family_catalog.bend as Catalog
10import bendvy-ecs-core@0.1.0.0/relation_commands.bend as Notice
11import bendvy-ecs-core@0.1.0.0/internal/relation_failures/domains.bend as Domains
12import bendvy-ecs-core@0.1.0.0/internal/relation_failures/queue.bend as Queue
13import bendvy-ecs-core@0.1.0.0/relation_types.bend as Graph
14
15def classify(~S:Data,~P:Data,value:Notice.Notice<S,P>) -> Maybe<Domains.DescriptorKey<S>>:
16 match value:
17 case Notice.RelationFailed{Graph.Failure{Graph.Descriptor{id,_,_,_},_,_,_,_}}:Some{Domains.DeclaredKey{id}}
18 case _:None{}
19def publish_clocked(~S:Data,~C:Type,~Resources:Type,~P:Data,~F:Type,~Owners:Type,~sync:F -> Nat -> List<&2,P> -> F,metadata:Mixed.State<S,P,F,Owners> & Nat,result:W.World<S,C,Resources,Notice.Notice<S,P>> & Tick.Tick) -> Route.Runtime<S,C,Resources,Notice.Notice<S,P>,Mixed.State<S,P,F,Owners>>:
20 match metadata result:
21 case (Mixed.State{typed,Mixed.Failures{domains,positions,+failureTick,start,boundary,capacity,nextReader}},+tick),(world,clock):Mixed.ingest(~S,~C,~Resources,~P,~F,~Owners,~sync,~classify(~S,~P),1n+Nat.max(1n,Nat.max(tick,Nat.max(failureTick,Tick.total(clock)))),Route.Runtime{world,Mixed.State{typed,Mixed.Failures{domains,positions,failureTick,start,boundary,capacity,nextReader}},tick})
22def publish(~S:Data,~C:Type,~Resources:Type,~P:Data,~F:Type,~Owners:Type,~sync:F -> Nat -> List<&2,P> -> F,world:W.World<S,C,Resources,Notice.Notice<S,P>>,metadata:Mixed.State<S,P,F,Owners> & Nat) -> Route.Runtime<S,C,Resources,Notice.Notice<S,P>,Mixed.State<S,P,F,Owners>>:
23 publish_clocked(~S,~C,~Resources,~P,~F,~Owners,~sync,metadata,W.clock(~S,~C,~Resources,~Notice.Notice<S,P>,world))
24
25# This adapter retains the ordinary mixed Runtime's exact metadata/owner type.
26def clear_domain(~S:Data,~P:Data,value:Domains.Domain<S,Notice.Notice<S,P>>) -> Domains.Domain<S,Notice.Notice<S,P>>:
27 match value:
28 case Domains.Domain{key,Queue.Queue{_,_,_,dropped},readers}:Domains.Domain{key,Queue.Queue{[],[],0n,dropped},readers}
29def clear_domains(~S:Data,~P:Data,values:List<&2,Domains.Domain<S,Notice.Notice<S,P>>>) -> List<&2,Domains.Domain<S,Notice.Notice<S,P>>>:
30 match values:
31 case []:[]
32 case head <> rest:clear_domain(~S,~P,head) <> clear_domains(~S,~P,rest)
33def clear_metadata(~S:Data,~P:Data,~F:Type,~Owners:Type,~clear:F -> F,metadata:Mixed.State<S,P,F,Owners> & Nat) -> Mixed.State<S,P,F,Owners> & Nat:
34 match metadata:
35 case (Mixed.State{Family.State{family,owners,_,familyStart},Mixed.Failures{domains,positions,tick,frameStart,boundary,capacity,nextReader}},familyTick):(Mixed.State{Family.State{clear(family),owners,[],familyStart},Mixed.Failures{clear_domains(~S,~P,domains),positions,tick,frameStart,boundary,capacity,nextReader}},familyTick)
36def drained(~S:Data,~C:Type,~User:Type,~Logs:Type,~Machines:Type,~P:Data,~F:Type,~Owners:Type,~Receipt:Type,~clear:F -> F,rest:WR.Rest<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>>,user:User,machines:Machines,metadata:Mixed.State<S,P,F,Owners> & Nat,result:Logs & Receipt) -> W.World<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>> & ((Mixed.State<S,P,F,Owners> & Nat) & Receipt):
37 match result:
38 case (logs,receipt):(W.events_replace(~S,~C,~Product.Owner<Product.Owner<User,Logs>,Machines>,~Notice.Notice<S,P>,WR.put(~S,~C,~Product.Owner<Product.Owner<User,Logs>,Machines>,~Notice.Notice<S,P>,rest,Product.Owner{Product.Owner{user,logs},machines}),[]),(clear_metadata(~S,~P,~F,~Owners,~clear,metadata),receipt))
39def resource_taken(~S:Data,~C:Type,~User:Type,~Logs:Type,~Machines:Type,~P:Data,~F:Type,~Owners:Type,~Receipt:Type,~drain:Logs -> Logs & Receipt,~clear:F -> F,metadata:Mixed.State<S,P,F,Owners> & Nat,result:WR.Rest<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>> & Product.Owner<Product.Owner<User,Logs>,Machines>) -> W.World<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>> & ((Mixed.State<S,P,F,Owners> & Nat) & Receipt):
40 match result:
41 case (rest,Product.Owner{Product.Owner{user,logs},machines}):drained(~S,~C,~User,~Logs,~Machines,~P,~F,~Owners,~Receipt,~clear,rest,user,machines,metadata,drain(logs))
42# Internal admitted cleanup derives its complete log/stream tree from the catalog.
43# Allocator, store, registrations and all progress fields are unchanged.
44def admit(~S:Data,~C:Type,~User:Type,~Logs:Type,~Machines:Type,~P:Data,~F:Type,~Owners:Type,~Receipt:Type,~retain:Logs -> List<&2,P> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,-catalog:Catalog.Catalog<P,Logs,F,Receipt,retain,drain,clear>,world:W.World<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>>,metadata:Mixed.State<S,P,F,Owners> & Nat) -> W.World<S,C,Product.Owner<Product.Owner<User,Logs>,Machines>,Notice.Notice<S,P>> & ((Mixed.State<S,P,F,Owners> & Nat) & Receipt):
45 resource_taken(~S,~C,~User,~Logs,~Machines,~P,~F,~Owners,~Receipt,~drain,~clear,metadata,WR.take(~S,~C,~Product.Owner<Product.Owner<User,Logs>,Machines>,~Notice.Notice<S,P>,world))