Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh |
2 | * Jagannathan, and Stephen Weeks. | |
3 | * | |
4 | * MLton is released under a BSD-style license. | |
5 | * See the file MLton-LICENSE for details. | |
6 | *) | |
7 | ||
8 | structure Ref: REF = | |
9 | struct | |
10 | ||
11 | type 'a t = 'a ref | |
12 | ||
13 | val (op !) = (op !) | |
14 | ||
15 | val (op :=) = op := | |
16 | ||
17 | fun equals (r: 'a t, r') = r = r' | |
18 | ||
19 | fun swap (r, r') = let val v = !r | |
20 | in r := !r'; r' := v | |
21 | end | |
22 | ||
23 | fun getAndSet sel = (! o sel, fn (x, v) => sel x := v) | |
24 | ||
25 | fun ('a, 'b) fluidLet (r: 'a t, x: 'a, th: unit -> 'b): 'b = | |
26 | let | |
27 | val old = !r | |
28 | val () = r := x | |
29 | in | |
30 | Exn.finally (th, fn () => r := old) | |
31 | end | |
32 | ||
33 | fun getSet layout = | |
34 | let val r = ref NONE | |
35 | fun get () = | |
36 | case !r of | |
37 | NONE => Error.bug "Ref.getSet.get: not available" | |
38 | | SOME v => v | |
39 | fun set v = r := SOME v | |
40 | fun clear () = r := NONE | |
41 | val layout = fn () => layout (get ()) | |
42 | fun output out = Layout.output (layout (), out) | |
43 | fun print () = output Out.standard | |
44 | in {get = get, | |
45 | set = set, | |
46 | clear = clear, | |
47 | layout = layout, | |
48 | output = output, | |
49 | print = print} | |
50 | end | |
51 | ||
52 | fun layout layoutX r = layoutX (!r) | |
53 | ||
54 | fun memoize (r: 'a option ref, f: unit -> 'a): 'a = | |
55 | case !r of | |
56 | NONE => | |
57 | let | |
58 | val a = f () | |
59 | val () = r := SOME a | |
60 | in | |
61 | a | |
62 | end | |
63 | | SOME a => a | |
64 | ||
65 | end |