summaryrefslogtreecommitdiff
path: root/dynarray.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-08-04 22:13:17 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-08-04 22:13:17 +0200
commita4c60603f61dd1a9f0ce420be9067965586dd694 (patch)
treec5f48221a8291b817d6eec0fd3f70eeb8c26a300 /dynarray.sml
parent396ebf0c76153e5e1e9dc77371bdd02b4d3d85d1 (diff)
Object assembly
Diffstat (limited to 'dynarray.sml')
-rw-r--r--dynarray.sml20
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