From db459d59adefdc27262d3b8fd60b57595ec61732 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 5 Dec 2025 18:53:02 +0000 Subject: [PATCH] progress reimplementing 'helpInsert' in persistent-vector.sml by adding a helper function for creating a vector when the current node is split --- fcore/persistent-vector.sml | 46 ++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/fcore/persistent-vector.sml b/fcore/persistent-vector.sml index 406450c..2f9ea4e 100644 --- a/fcore/persistent-vector.sml +++ b/fcore/persistent-vector.sml @@ -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