execution_restore_publication.bend
bendvy-ecs-core@0.1.0.3 · 38 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_reservation_bundle.bend as Bundle
4import bendvy-ecs-core@0.1.0.3/execution_reservation_materialization.bend as Materialize
5import bendvy-ecs-core@0.1.0.3/execution_command_permission.bend as Permission
6import bendvy-ecs-core@0.1.0.3/restore_data.bend as R
7import bendvy-ecs-core@0.1.0.3/entity_key.bend as Key
8import bendvy-ecs-core@0.1.0.3/world.bend as W
9import bendvy-ecs-core@0.1.0.3/change_tick.bend as Tick
10
11type Row<-layout:Layout.Layout> is Type:Row{saved:Key.Key,bundle:Bundle.Payload(layout)}
12type Receipt<-S:Data,-layout:Layout.Layout> is Type:
13 Materialized{saved:Key.Key,handle:W.Handle<S>,previous:Bundle.Payload(layout)}
14 AllocationRefused{saved:Key.Key,bundle:Bundle.Payload(layout)}
15 PublicationRefused{saved:Key.Key,handle:W.Handle<S>,bundle:Bundle.Payload(layout),reason:Bundle.Refusal}
16type Published<-S:Data,-layout:Layout.Layout,-Resource:Type,-E:Data> is Type:
17 Published{world:W.World<S,Layout.columns(~S,layout),Resource,E>,mapping:List<&2,R.Binding<S>>,receipts:List<Receipt<S,layout>>,complete:Bool}
18def materialized(~S:Data,~layout:Layout.Layout,~Resource:Type,~E:Data,saved:Key.Key,result:Bundle.Publication<S,Layout.columns(~S,layout),Resource,E,layout>) -> W.World<S,Layout.columns(~S,layout),Resource,E> & Receipt<S,layout>:
19 match result:
20 case Bundle.Materialized{world,handle,previous}:(world,Materialized{saved,handle,previous})
21 case Bundle.RefusedPublication{world,handle,bundle,reason}:(world,PublicationRefused{saved,handle,bundle,reason})
22def reserved(~S:Data,~layout:Layout.Layout,~Resource:Type,~E:Data,saved:Key.Key,bundle:Bundle.Payload(layout),tick:Tick.Tick,result:W.World<S,Layout.columns(~S,layout),Resource,E> & W.Reservation<S>) -> W.World<S,Layout.columns(~S,layout),Resource,E> & Receipt<S,layout>:
23 match result:
24 case (world,W.ReservationRejected{_}):(world,AllocationRefused{saved,bundle})
25 case (world,W.Reserved{+handle}):materialized(~S,~layout,~Resource,~E,saved,Materialize.apply_at(~S,~Resource,~E,~layout,Permission.EntityStructural{},W.mark_pending(~S,~Layout.columns(~S,layout),~Resource,~E,world,handle),handle,bundle,tick))
26def returned(~S:Data,~layout:Layout.Layout,~Resource:Type,~E:Data,next:W.World<S,Layout.columns(~S,layout),Resource,E> -> List<&2,R.Binding<S>> -> List<Receipt<S,layout>> -> Bool -> Published<S,layout,Resource,E>,mapping:List<&2,R.Binding<S>>,receipts:List<Receipt<S,layout>>,complete:Bool,result:W.World<S,Layout.columns(~S,layout),Resource,E> & Receipt<S,layout>) -> Published<S,layout,Resource,E>:
27 match result:
28 case (world,Materialized{+saved,+handle,previous}):next(world,R.Binding{saved,handle} <> mapping,Materialized{saved,handle,previous} <> receipts,complete)
29 case (world,receipt):next(world,mapping,receipt <> receipts,False{})
30def rows(~S:Data,~layout:Layout.Layout,~Resource:Type,~E:Data,values:List<Row<layout>>,world:W.World<S,Layout.columns(~S,layout),Resource,E>,+tick:Tick.Tick,mapping:List<&2,R.Binding<S>>,receipts:List<Receipt<S,layout>>,complete:Bool) -> Published<S,layout,Resource,E>:
31 match values:
32 case []:Published{world,List.reverse(&2,R.Binding<S>,mapping),List.reverse(&1,Receipt<S,layout>,receipts),complete}
33 case Row{saved,bundle} <> rest:returned(~S,~layout,~Resource,~E,nextWorld => nextMapping => nextReceipts => nextComplete => rows(~S,~layout,~Resource,~E,rest,nextWorld,tick,nextMapping,nextReceipts,nextComplete),mapping,receipts,complete,reserved(~S,~layout,~Resource,~E,saved,bundle,tick,W.reserve_id(~S,~Layout.columns(~S,layout),~Resource,~E,world)))
34
35
36
37def publish(~S:Data,~layout:Layout.Layout,~Resource:Type,~E:Data,values:List<Row<layout>>,world:W.World<S,Layout.columns(~S,layout),Resource,E>,tick:Tick.Tick) -> Published<S,layout,Resource,E>:
38 rows(~S,~layout,~Resource,~E,values,world,tick,[],[],True{})