File: undoable-ref.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (44 lines) | stat: -rw-r--r-- 761 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(*
 *  A reference that allows undo.
 *
 *  -- Allen
 *)

signature UNDOABLE_REF =
sig
   eqtype 'a uref 
   val uref : 'a -> 'a uref
   val !   : 'a uref -> 'a
   val :=  : 'a uref * 'a -> unit
end

functor UndoableRef (Log : TRANSACTION_LOG) : UNDOABLE_REF =
struct

   type 'a uref = 'a ref * Log.version ref 

   fun uref a = (ref a, ref(!Log.version))

   fun !! (r,_) = !r

   fun commit (x,v) = fn ver => v := ver

   fun rollback (x,v) = 
   let val x' = !x
   in  fn ver => (x := x'; v := ver)
   end

   fun ::= (r as (x,v),y) = 
   let val ver = !Log.version
   in  if !v <> ver then (Log.add_object{rollback = rollback r,
					 commit   = commit r
					}; 
			  v := ver)
       else ();
       x := y
   end

   val !  = !!
   val op := = ::=
end