1 import Base 2 import world.bend as W 3 import transaction.bend as T 4 5 type Delivery is Type: 6 Delivered{world:W} 7 Undelivered{world:W,payload:P,error:W.WorldError} 8 def deliver(~World:Type,~P:Type,~recover:World -> P -> W.WorldError -> World,result:Delivery) -> World: 9 match result: 10 case Delivered{world}: world 11 case Undelivered{world,payload,error}: recover(world,payload,error) 12 def apply_checked(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~attempt:W.World -> W.Handle -> P -> Delivery,P>,~recover:W.World -> P -> W.WorldError -> W.World,observed:W.World & Bool,handle:W.Handle,payload:P) -> W.World: 13 match observed: 14 case (world,False{}): recover(world,payload,W.MissingEntity{}) 15 case (world,True{}): deliver(~W.World,~P,~recover,attempt(world,handle,payload)) 16 def apply(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~attempt:W.World -> W.Handle -> P -> Delivery,P>,~recover:W.World -> P -> W.WorldError -> W.World,world:W.World,+handle:W.Handle,payload:P) -> W.World: 17 apply_checked(~S,~Store,~R,~E,~P,~attempt,~recover,W.valid(~S,~Store,~R,~E,world,handle),handle,payload) 18 def enqueue(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~attempt:W.World -> W.Handle -> P -> Delivery,P>,~recover:W.World -> P -> W.WorldError -> W.World,tx:T.Tx,E>,+handle:W.Handle,payload:P) -> T.Tx,E>: 19 T.stage(~W.World,~E,tx,w => apply(~S,~Store,~R,~E,~P,~attempt,~recover,w,handle,payload))