Import Upstream version 20180207
[hcoop/debian/mlton.git] / lib / mlton / basic / doubly-linked.fun
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
8 functor DoublyLinked(S: DOUBLY_LINKED_STRUCTS): DOUBLY_LINKED =
9 struct
10
11 open S
12
13 fun prevp d = #1(destruct d)
14 fun prev d = Pointer.!(prevp d)
15 fun setPrev(d,d') = Pointer.:=(prevp d,d')
16 fun value d = #2(destruct d)
17 fun nextp d = #3(destruct d)
18 fun next d = Pointer.!(nextp d)
19 fun setNext(d,d') = Pointer.:=(nextp d,d')
20
21 fun link(d, d') =
22 (setNext(d, d')
23 ; setPrev(d',d))
24
25 fun insertL(d, d') =
26 (if Pointer.isNull(prevp d') then () else link(prev d',d)
27 ; link(d,d'))
28
29 fun insertR(d, d') =
30 (if Pointer.isNull(nextp d) then () else link(d',next d)
31 ; link(d, d'))
32
33 fun unlink d =
34 (link(prev d,next d)
35 ; Pointer.clear(prevp d)
36 ; Pointer.clear(nextp d))
37
38 fun isLinked d =
39 not(Pointer.isNull(prevp d) orelse Pointer.isNull(nextp d))
40
41 fun eqPrev(d, d') = Pointer.eq(prevp d, prevp d')
42
43 end