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