Import Upstream version 20180207
[hcoop/debian/mlton.git] / lib / mlton / basic / pointer.sml
CommitLineData
7f918cf1
CE
1(* Copyright (C) 1999-2006 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 Pointer: POINTER =
9struct
10
11datatype 'a t = T of 'a option ref
12
13fun !(T r) =
14 case Ref.! r of
15 NONE => Error.bug "Pointer.!"
16 | SOME v => v
17
18fun (T r) := v = Ref.:=(r, SOME v)
19
20fun clear(T r) = Ref.:=(r, NONE)
21
22fun copy(T r, T r') = Ref.:=(r, Ref.! r')
23
24fun eq(T r, T r') = Ref.equals(r, r')
25
26fun follow(T r) = Ref.! r
27
28fun equals(p, p', equals) =
29 case (follow p, follow p') of
30 (NONE, NONE) => true
31 | (SOME v, SOME v') => equals(v, v')
32 | _ => false
33
34fun isNull p = Option.isNone(follow p)
35
36fun make v = T(ref v)
37
38fun new v = make(SOME v)
39
40fun null() = make NONE
41
42fun swap(T p, T p') = Ref.swap(p, p')
43
44end