Import Upstream version 20180207
[hcoop/debian/mlton.git] / lib / mlton / basic / ref.sml
CommitLineData
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
8structure Ref: REF =
9struct
10
11type 'a t = 'a ref
12
13val (op !) = (op !)
14
15val (op :=) = op :=
16
17fun equals (r: 'a t, r') = r = r'
18
19fun swap (r, r') = let val v = !r
20 in r := !r'; r' := v
21 end
22
23fun getAndSet sel = (! o sel, fn (x, v) => sel x := v)
24
25fun ('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
33fun 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
52fun layout layoutX r = layoutX (!r)
53
54fun 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
65end