1 import Base 2 import ./deferred_command.bend as Deferred 3 import ./trace_facts.bend as TraceFacts 4 import ./world.bend as W 5 import ./transaction.bend as T 6 7 def get_join(~S: Data,~C: Type,~R: Type,~E: Data,~V: Data,observed: W.World & V,undo: List<(W.World -> W.World)>,commands:List>>,events: List<&2,E>,trace:TraceFacts.State) -> T.Tx,E> & V: 8 (world,value) = observed 9 (T.Tx{world,undo,commands,events,trace},value) 10 11 def tx_get(~S: Data,~C: Type,~R: Type,~E: Data,~V: Data,~project: R -> R & V,tx: T.Tx,E>) -> T.Tx,E> & V: 12 match tx: 13 case T.Tx{world,undo,commands,events,trace}: get_join(~S,~C,~R,~E,~V,W.observe_resource(~S,~C,~R,~E,~V,~project,world),undo,commands,events,trace) 14 15 def restore_join(~S: Data,~C: Type,~R: Type,~E: Data,replaced: W.World & R) -> W.World: 16 (world,discarded) = replaced 17 world 18 19 def restore(~S: Data,~C: Type,~R: Type,~E: Data,world: W.World,old: R) -> W.World: 20 restore_join(~S,~C,~R,~E,W.replace_resource(~S,~C,~R,~E,world,old)) 21 22 def replace_join(~S: Data,~C: Type,~R: Type,~E: Data,replaced: W.World & R,undo: List<(W.World -> W.World)>,commands:List>>,events: List<&2,E>,trace:TraceFacts.State) -> T.Tx,E>: 23 (world,old) = replaced 24 T.Tx{world,(w => restore(~S,~C,~R,~E,w,old)) <> undo,commands,events,trace} 25 26 def tx_replace(~S: Data,~C: Type,~R: Type,~E: Data,tx: T.Tx,E>,replacement: R) -> T.Tx,E>: 27 match tx: 28 case T.Tx{world,undo,commands,events,trace}: replace_join(~S,~C,~R,~E,W.replace_resource(~S,~C,~R,~E,world,replacement),undo,commands,events,trace)