1 (* Copyright (C
) 1999-2006 Henry Cejtin
, Matthew Fluet
, Suresh
2 * Jagannathan
, and Stephen Weeks
.
4 * MLton is released under a BSD
-style license
.
5 * See the file MLton
-LICENSE for details
.
8 structure AppendList
: APPEND_LIST
=
11 (* We are careful to ensure that the empty list is always represented by
12 * the Empty constructor
.
15 Append
of 'a t
* 'a
t (* Neither is empty
. *)
16 | Appends
of 'a t
list (* None is empty
and list is nonempty
. *)
17 | AppendsV
of 'a t
vector (* None is empty
and vector is nonempty
. *)
18 | Cons
of 'a
* 'a
t (* Nonempty
. *)
20 |
List of 'a
list (* Nonempty
. *)
22 | Snoc
of 'a
t (* Nonempty
*) * 'a
23 |
Vector of 'a
vector (* Nonempty
. *)
25 val isEmpty
= fn Empty
=> true | _
=> false
36 val l
= List.keepAll (l
, not
o isEmpty
)
45 val v
= Vector.keepAll (v
, not
o isEmpty
)
80 Append (l
, l
') => loop (l
', loop (l
, b
))
81 | Appends l
=> List.fold (l
, b
, loop
)
82 | AppendsV v
=> Vector.fold (v
, b
, loop
)
83 |
Cons (x
, l
) => loop (l
, f (x
, b
))
85 |
List l
=> List.fold (l
, b
, f
)
86 | Single x
=> f (x
, b
)
87 |
Snoc (l
, x
) => f (x
, loop (l
, b
))
88 |
Vector v
=> Vector.fold (v
, b
, f
)
92 fun length l
: int = fold (l
, 0, fn (_
, i
) => i
+ 1)
94 fun foreach (l
, f
) = fold (l
, (), fn (x
, ()) => f x
)
100 Append (l
, l
') => loop (l
, loop (l
', b
))
101 | Appends l
=> List.foldr (l
, b
, loop
)
102 | AppendsV v
=> Vector.foldr (v
, b
, loop
)
103 |
Cons (x
, l
) => f (x
, loop (l
, b
))
105 |
List l
=> List.foldr (l
, b
, f
)
106 | Single x
=> f (x
, b
)
107 |
Snoc (l
, x
) => loop (l
, f (x
, b
))
108 |
Vector v
=> Vector.foldr (v
, b
, f
)
115 fn Append (l
, l
') => Append (loop l
, loop l
')
116 | Appends l
=> Appends (List.map (l
, loop
))
117 | AppendsV v
=> AppendsV (Vector.map (v
, loop
))
118 |
Cons (x
, l
) => Cons (f x
, loop l
)
120 |
List l
=> List (List.map (l
, f
))
121 | Single x
=> Single (f x
)
122 |
Snoc (l
, x
) => Snoc (loop l
, f x
)
123 |
Vector v
=> Vector (Vector.map (v
, f
))
127 fun toList ds
= foldr (ds
, [], op ::)
129 fun toListOnto (ds
, l
) = foldr (ds
, l
, op ::)
131 fun toVector ds
= Vector.tabulator (length ds
, fn call
=> foreach (ds
, call
))
133 fun layout layoutX l
= List.layout
layoutX (toList l
)
135 fun push (r
, x
) = r
:= cons (x
, !r
)