complete first pass of implementing 'splitRight' in persistent-vector.sml

This commit is contained in:
2025-12-07 03:43:15 +00:00
parent 3318501c00
commit 0650b372b2

View File

@@ -417,7 +417,7 @@ struct
else else
Vector.sub (sizes, i) Vector.sub (sizes, i)
) )
val nodes = Vector.tabulate (lane, val nodes = Vector.tabulate (len,
fn i => fn i =>
if i = idx then if i = idx then
result result
@@ -456,6 +456,7 @@ struct
case tree of case tree of
BRANCH (nodes, sizes) => BRANCH (nodes, sizes) =>
if offset <= Vector.sub (sizes, 0) then if offset <= Vector.sub (sizes, 0) then
(* we want to split first node *)
let let
val firstSizeBefore = Vector.sub (sizes, 0) val firstSizeBefore = Vector.sub (sizes, 0)
val result = splitRight (offset, Vector.sub (nodes, 0)) val result = splitRight (offset, Vector.sub (nodes, 0))
@@ -488,23 +489,38 @@ struct
in in
BRANCH (nodes, sizes) BRANCH (nodes, sizes)
end end
end
else if offset >= Vector.sub (sizes, Vector.length sizes - 1) then else if offset >= Vector.sub (sizes, Vector.length sizes - 1) then
let (* we want to split after last node, leaving empty *)
val prevSize = BRANCH (#[], #[])
if Vector.length sizes > 1 then
Vector.sub (sizes, Vector.length sizes - 2)
else else
0 let
val node = Vector.sub (nodes, Vector.length nodes - 1) val idx = BinSearch.equalOrMore (offset, sizes)
val result = splitRight (offset - prevSize, node)) val prevSize = Vector.sub (sizes, idx - 1)
val curSize = Vector.sub (sizes, idx)
val result = splitRight (offset - prevSize, Vector.sub (nodes, idx))
in in
if isEmpty result then if isEmpty result then
result let
val startIdx = idx + 1
val len = Vector.length sizes - startIdx
val sizeSlice = VectorSlice.slice (sizes, startIdx, SOME len)
val sizes = VectorSlice.map (fn el => el - curSize) sizeSlice
val nodeSlice = VectorSlice.slice (nodes, startIdx, SOME len)
val nodes = VectorSlice.vector nodeSlice
in
BRANCH (nodes, sizes)
end
else else
let let
val newCurSize = getMaxSize result
val sizeDiff = curSize - newCurSize
val len = Vector.length sizes - idx val len = Vector.length sizes - idx
val sizeSlice = VectorSlice.slice (sizes, idx, SOME len) val sizeSlice = VectorSlice.slice (sizes, idx, SOME len)
val sizes = VectorSlice.map (fn el => el - prevSize) sizeSlice val sizes = VectorSlice.map (fn el => el - sizeDiff) sizeSlice
val nodeSlice = VectorSlice.slice (nodes, idx, SOME len) val nodeSlice = VectorSlice.slice (nodes, idx, SOME len)
val nodes = VectorSlice.vector nodeSlice val nodes = VectorSlice.vector nodeSlice
@@ -512,7 +528,6 @@ struct
BRANCH (nodes, sizes) BRANCH (nodes, sizes)
end end
end end
else
| LEAF (items, sizes) => | LEAF (items, sizes) =>
if offset > Vector.sub (sizes, Vector.length sizes - 1) then if offset > Vector.sub (sizes, Vector.length sizes - 1) then
LEAF (#[], #[]) LEAF (#[], #[])