diff options
Diffstat (limited to 'dynarray.sml')
-rw-r--r-- | dynarray.sml | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/dynarray.sml b/dynarray.sml index b052989..371362e 100644 --- a/dynarray.sml +++ b/dynarray.sml @@ -17,7 +17,8 @@ structure Dynarray: DYNARRAY = struct let val (len, arr) = !dynarr in - if len = Array.length arr then + case Int.compare (len, Array.length arr) of + EQUAL => let val arr2 = Array.array (len * 2, NONE) in @@ -25,9 +26,11 @@ structure Dynarray: DYNARRAY = struct dynarr := (len, arr2); push dynarr v end - else + | LESS => ( Array.update (arr, len, SOME v); dynarr := (len + 1, arr) + ) + | GREATER => raise Unreachable end fun get dynarr n = @@ -70,4 +73,17 @@ structure Dynarray: DYNARRAY = struct in Vector.fromList l end + + fun appi f dynarr = + let + val (len, arr) = !dynarr + + fun loop idx = + if idx = len then + () + else + f (idx, valOf $ Array.sub (arr, idx)) + in + loop 0 + end end |