progress reimplementing 'helpInsert' in persistent-vector.sml by adding a helper function for creating a vector when the current node is split

This commit is contained in:
2025-12-05 18:53:02 +00:00
parent 1f5cf157b1
commit db459d59ad

View File

@@ -359,6 +359,49 @@ struct
LEAF (_, sizes) => Vector.sub (sizes, Vector.length sizes - 1)
| BRANCH (_, sizes) => Vector.sub (sizes, Vector.length sizes - 1)
fun insertSplitSizesLeft (idx, sizes, left, right, prevSize) =
if idx < halfSize then
(* left-split node is in left vector *)
if idx + 1 < halfSize then
(* right-split node is also in left vector *)
let
val ls = getMaxSize left + prevSize
val rs = getMaxSize right + ls
val sizeDiff = rs - prevSize
in
Vector.tabulate (halfSize,
fn i =>
if i = idx then
ls
else if i = idx + 1 then
rs
else if i < idx then
Vector.sub (sizes, i)
else
Vector.sub (sizes, i - 1) + sizeDiff)
end
else
(* left-split node is in left vector
* but right-split node is not *)
let
val ls = getMaxSize left + prevSize
in
Vector.tabulate (halfSize,
fn i =>
if i = idx then
ls
else
Vector.sub (sizes, i))
end
else
(* neither left-split node, nor right-split node,
* are in the left-split vector. *)
let
val slice = Vector.slice (sizes, 0, SOME halfSize)
in
VectorSlice.vector slice
end
fun helpInsert (start, finish, tree) =
case tree of
BRANCH (nodes, sizes) =>
@@ -468,7 +511,8 @@ struct
if Vector.length nodes = maxSize then
(* have to split *)
let
val leftSize = getMaxSize left + prevSize
val leftSizes =
insertSplitSizesLeft (idx, sizes, left, right, prevSize)
in
end