restore_product.bend
bendvy-ecs-core@0.1.0.0 · 39 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/restore_data.bend as R
5import bendvy-ecs-core@0.1.0.0/decode_data.bend as D
6import bendvy-ecs-core@0.1.0.0/owner_product.bend as Product
7
8def staged_right(~L:Type,~Right:Type,~Custom:Data,left:L,observed:Right & R.Dispatch<Custom>) -> Product.Owner<L,Right> & R.Dispatch<Custom>:
9 match observed:
10 case (right,result):(Product.Owner{left,right},result)
11def staged_left(~L:Type,~Right:Type,~Custom:Data,~stageRight:Right -> R.Position -> D.Field -> Right & R.Dispatch<Custom>,right:Right,position:R.Position,field:D.Field,observed:L & R.Dispatch<Custom>) -> Product.Owner<L,Right> & R.Dispatch<Custom>:
12 match observed:
13 case (left,R.Unhandled{}):staged_right(~L,~Right,~Custom,left,stageRight(right,position,field))
14 case (left,result):(Product.Owner{left,right},result)
15def stage(~L:Type,~Right:Type,~Custom:Data,~stageLeft:L -> R.Position -> D.Field -> L & R.Dispatch<Custom>,~stageRight:Right -> R.Position -> D.Field -> Right & R.Dispatch<Custom>,state:Product.Owner<L,Right>,+position:R.Position,+field:D.Field) -> Product.Owner<L,Right> & R.Dispatch<Custom>:
16 match state:
17 case Product.Owner{left,right}:staged_left(~L,~Right,~Custom,~stageRight,right,position,field,stageLeft(left,position,field))
18def release(~L:Type,~Right:Type,~releaseLeft:L -> L,~releaseRight:Right -> Right,state:Product.Owner<L,Right>) -> Product.Owner<L,Right>:
19 match state:
20 case Product.Owner{left,right}:Product.Owner{releaseLeft(left),releaseRight(right)}
21
22def insert_join(~LC:Type,~LR:Type,~RC:Type,~RR:Type,~L:Type,~Right:Type,left:LC,leftResource:LR,state:L,observed:(RC & RR) & Right) -> (Product.Owner<LC,RC> & Product.Owner<LR,RR>) & Product.Owner<L,Right>:
23 match observed:
24 case ((right,rightResource),stateRight):((Product.Owner{left,right},Product.Owner{leftResource,rightResource}),Product.Owner{state,stateRight})
25def insert_next(~S:Data,~LC:Type,~LR:Type,~RC:Type,~RR:Type,~L:Type,~Right:Type,~insertRight:RC -> RR -> Right -> List<&2,R.Binding<S>> -> Tick.Tick -> (RC & RR) & Right,right:RC,rightResource:RR,stateRight:Right,bindings:List<&2,R.Binding<S>>,tick:Tick.Tick,observed:(LC & LR) & L) -> (Product.Owner<LC,RC> & Product.Owner<LR,RR>) & Product.Owner<L,Right>:
26 match observed:
27 case ((left,leftResource),state):insert_join(~LC,~LR,~RC,~RR,~L,~Right,left,leftResource,state,insertRight(right,rightResource,stateRight,bindings,tick))
28def insert(~S:Data,~LC:Type,~LR:Type,~RC:Type,~RR:Type,~L:Type,~Right:Type,~insertLeft:LC -> LR -> L -> List<&2,R.Binding<S>> -> Tick.Tick -> (LC & LR) & L,~insertRight:RC -> RR -> Right -> List<&2,R.Binding<S>> -> Tick.Tick -> (RC & RR) & Right,owner:Product.Owner<LC,RC>,resource:Product.Owner<LR,RR>,state:Product.Owner<L,Right>,+bindings:List<&2,R.Binding<S>>,+tick:Tick.Tick) -> (Product.Owner<LC,RC> & Product.Owner<LR,RR>) & Product.Owner<L,Right>:
29 match owner resource state:
30 case Product.Owner{left,right} Product.Owner{leftResource,rightResource} Product.Owner{stateLeft,stateRight}:insert_next(~S,~LC,~LR,~RC,~RR,~L,~Right,~insertRight,right,rightResource,stateRight,bindings,tick,insertLeft(left,leftResource,stateLeft,bindings,tick))
31def recovery_join(~L:Type,~Right:Type,~LR:Type,~RR:Type,left:L,recovery:LR,observed:Right & RR) -> Product.Owner<L,Right> & Product.Owner<LR,RR>:
32 match observed:
33 case (right,more):(Product.Owner{left,right},Product.Owner{recovery,more})
34def recovery_left(~L:Type,~Right:Type,~LR:Type,~RR:Type,~takeRight:Right -> Right & RR,right:Right,observed:L & LR) -> Product.Owner<L,Right> & Product.Owner<LR,RR>:
35 match observed:
36 case (left,recovery):recovery_join(~L,~Right,~LR,~RR,left,recovery,takeRight(right))
37def take_recovery(~L:Type,~Right:Type,~LR:Type,~RR:Type,~takeLeft:L -> L & LR,~takeRight:Right -> Right & RR,state:Product.Owner<L,Right>) -> Product.Owner<L,Right> & Product.Owner<LR,RR>:
38 match state:
39 case Product.Owner{left,right}:recovery_left(~L,~Right,~LR,~RR,~takeRight,right,takeLeft(left))