owned_event_family_maintenance.bend

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

1import Base
2import bendvy-ecs-core@0.1.0.0/world.bend as W
3import bendvy-ecs-core@0.1.0.0/world_resource_owner.bend as WR
4import bendvy-ecs-core@0.1.0.0/owner_product.bend as Product
5import bendvy-ecs-core@0.1.0.0/event_runtime.bend as Ev
6import bendvy-ecs-core@0.1.0.0/event_family_runtime.bend as FR
7import bendvy-ecs-core@0.1.0.0/event_family_routing.bend as Route
8import bendvy-ecs-core@0.1.0.0/owned_event_family_catalog.bend as Catalog
9# The complete typed catalog is derived by leaf/both, not a list of user cleanup
10# callbacks. All payload owners are returned before shared publication state clears.
11def resource_returned(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~Receipt:Type,rest:WR.Rest<S,C,Product.Owner<User,Logs>,E>,user:User,result:Logs & Receipt) -> W.World<S,C,Product.Owner<User,Logs>,E> & Receipt:
12  match result:
13    case (logs,receipt):(WR.put(~S,~C,~Product.Owner<User,Logs>,~E,rest,Product.Owner{user,logs}),receipt)
14def resource_taken(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~Receipt:Type,~retain:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,shutdown:Bool,records:List<&2,E>,result:WR.Rest<S,C,Product.Owner<User,Logs>,E> & Product.Owner<User,Logs>) -> W.World<S,C,Product.Owner<User,Logs>,E> & Receipt:
15  match shutdown result:
16    case False{}, (rest,Product.Owner{user,logs}):resource_returned(~S,~C,~User,~Logs,~E,~Receipt,rest,user,retain(logs,records))
17    case True{}, (rest,Product.Owner{user,logs}):resource_returned(~S,~C,~User,~Logs,~E,~Receipt,rest,user,drain(logs))
18def completed(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~F:Type,~Owners:Type,~Receipt:Type,~clear:F -> F,shutdown:Bool,family:F,owners:Owners,journal:List<&2,Ev.Batch<E>>,frameStart:Nat,tick:Nat,result:W.World<S,C,Product.Owner<User,Logs>,E> & Receipt) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
19  match shutdown result:
20    case False{}, (world,receipt):(Route.Runtime{world,FR.State{family,owners,journal,frameStart},tick},receipt)
21    case True{}, (world,receipt):(Route.Runtime{W.events_replace(~S,~C,~Product.Owner<User,Logs>,~E,world,[]),FR.State{clear(family),owners,[],frameStart},tick},receipt)
22def observed(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~F:Type,~Owners:Type,~Receipt:Type,~retain:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,+shutdown:Bool,family:F,owners:Owners,journal:List<&2,Ev.Batch<E>>,frameStart:Nat,tick:Nat,result:W.World<S,C,Product.Owner<User,Logs>,E> & List<&2,E>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
23  match result:
24    case (world,records):completed(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~clear,shutdown,family,owners,journal,frameStart,tick,resource_taken(~S,~C,~User,~Logs,~E,~Receipt,~retain,~drain,shutdown,records,WR.take(~S,~C,~Product.Owner<User,Logs>,~E,world)))
25def collect(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~F:Type,~Owners:Type,~Receipt:Type,~retain:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,shutdown:Bool,runtime:Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
26  match runtime:
27    case Route.Runtime{world,FR.State{family,owners,journal,frameStart},tick}:observed(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~retain,~drain,~clear,shutdown,family,owners,journal,frameStart,tick,W.events_view(~S,~C,~Product.Owner<User,Logs>,~E,world))
28def frame(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~F:Type,~Owners:Type,~Receipt:Type,~retain:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,~catalog:Catalog.Catalog<E,Logs,F,Receipt,retain,drain,clear>,~frame:F -> Nat -> F,~retainRecords:F -> Nat -> List<&2,E> -> F & List<&2,E>,runtime:Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
29  collect(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~retain,~drain,~clear,False{},FR.frame(~S,~C,~Product.Owner<User,Logs>,~E,~F,~Owners,~frame,~retainRecords,runtime))
30def shutdown(~S:Data,~C:Type,~User:Type,~Logs:Type,~E:Data,~F:Type,~Owners:Type,~Receipt:Type,~retain:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,~catalog:Catalog.Catalog<E,Logs,F,Receipt,retain,drain,clear>,runtime:Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
31  collect(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~retain,~drain,~clear,True{},runtime)