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