summaryrefslogtreecommitdiff
path: root/dynarray.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-08-07 22:25:26 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-08-07 22:25:26 +0200
commitb0cb85edf2b60f6f0909355db717376f435ab312 (patch)
treef799f756ded29f2f43dbb686198e0a9c5e11a0a2 /dynarray.sml
parent8ecbaf49113acb9e56a3af65117c15773b0f66ac (diff)
Removal of unused labels, basic live intervals
Diffstat (limited to 'dynarray.sml')
-rw-r--r--dynarray.sml44
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