summaryrefslogtreecommitdiff
path: root/dynarray.sml
diff options
context:
space:
mode:
Diffstat (limited to 'dynarray.sml')
-rw-r--r--dynarray.sml55
1 files changed, 55 insertions, 0 deletions
diff --git a/dynarray.sml b/dynarray.sml
new file mode 100644
index 0000000..0c1cd7f
--- /dev/null
+++ b/dynarray.sml
@@ -0,0 +1,55 @@
+structure Dynarray: DYNARRAY = struct
+ type 'a t = (int * 'a option Array.array) ref
+
+ exception OutOfBounds
+
+ fun create n =
+ ref (0, Array.array (n, NONE))
+
+ fun create0 () = create 10
+
+ fun length dynarr =
+ let
+ val (len, _) = !dynarr
+ in
+ len
+ end
+
+ fun push dynarr v =
+ let
+ val (len, arr) = !dynarr
+ in
+ if len = Array.length arr then
+ let
+ val arr2 = Array.array (len * 2, NONE)
+ in
+ Array.copy { src = arr, dst = arr2, di = 0 };
+ dynarr := (len, arr2);
+ push dynarr v
+ end
+ else
+ Array.update (arr, len, SOME v);
+ dynarr := (len + 1, arr)
+ end
+
+ fun get dynarr n =
+ let
+ val (len, arr) = !dynarr
+ in
+ if n >= len then
+ raise OutOfBounds
+ else
+ valOf $ Array.sub (arr, n)
+ end
+
+ fun set dynarr n v =
+ let
+ val (len, arr) = !dynarr
+ in
+ if n >= len then
+ raise OutOfBounds
+ else
+ Array.update (arr, n, SOME v)
+ end
+
+end