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