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