diff options
Diffstat (limited to 'dynarray.sml')
-rw-r--r-- | dynarray.sml | 55 |
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 |