summaryrefslogtreecommitdiff
path: root/dynarray.sml
diff options
context:
space:
mode:
Diffstat (limited to 'dynarray.sml')
-rw-r--r--dynarray.sml44
1 files changed, 42 insertions, 2 deletions
diff --git a/dynarray.sml b/dynarray.sml
index d52f148..4e64461 100644
--- a/dynarray.sml
+++ b/dynarray.sml
@@ -89,9 +89,49 @@ structure Dynarray: DYNARRAY = struct
fun loop idx =
if idx = len then
()
- else
- f (idx, valOf $ Array.sub (arr, idx))
+ else (
+ f (idx, valOf $ Array.sub (arr, idx));
+ loop (idx + 1)
+ )
in
loop 0
end
+
+ fun last dynarr =
+ let
+ val len = length dynarr
+ in
+ get dynarr (len - 1)
+ end
+
+ fun pop dynarr =
+ let
+ val v = last dynarr
+ val (len, arr) = !dynarr
+ in
+ dynarr := (len - 1, arr);
+ v
+ end
+
+ fun update dynarr f id =
+ let
+ val v = get dynarr id
+ val v = f v
+ in
+ set dynarr id v
+ end
+
+ fun copy (dynarr: 'a t) (f: 'a -> 'b): 'b t =
+ let
+ val dynarr2 = create (length dynarr)
+
+ fun loop idx =
+ if idx = length dynarr then
+ ()
+ else
+ (push dynarr2 (f $ get dynarr idx); loop (idx + 1))
+ in
+ loop 0;
+ dynarr2
+ end
end