212 fun node_trans _ _ _ (State NONE) = raise UNDEF |
212 fun node_trans _ _ _ (State NONE) = raise UNDEF |
213 | node_trans int hist f (State (SOME (node, term))) = |
213 | node_trans int hist f (State (SOME (node, term))) = |
214 let |
214 let |
215 fun mk_state nd = State (SOME (nd, term)); |
215 fun mk_state nd = State (SOME (nd, term)); |
216 |
216 |
217 val cont_node = History.map (checkpoint_node int) node; |
217 val f' = checkpoint_node int o f int o copy_node int; |
218 val back_node = History.map (copy_node int) cont_node; |
218 |
219 |
219 val trans = if hist then History.apply else History.map; |
220 val trans = if hist then History.apply_copy (copy_node int) else History.map; |
|
221 val (result, opt_exn) = |
220 val (result, opt_exn) = |
222 (mk_state (transform_error (interruptible (trans (f int))) cont_node), NONE) |
221 (mk_state (transform_error (interruptible (trans f')) node), NONE) |
223 handle exn => (mk_state cont_node, SOME exn); |
222 handle exn => (mk_state node, SOME exn); |
224 in |
223 in |
225 if is_stale result then return (mk_state back_node, SOME (if_none opt_exn rollback)) |
224 if is_stale result then return (mk_state node, SOME (if_none opt_exn rollback)) |
226 else return (result, opt_exn) |
225 else return (result, opt_exn) |
227 end; |
226 end; |
228 |
227 |
229 fun check_stale state = |
228 fun check_stale state = |
230 if not (is_stale state) then () |
229 if not (is_stale state) then () |