progress reimplementing 'helpInsert' so that it is aware of rope-like metadata

This commit is contained in:
2025-12-05 13:32:16 +00:00
parent 343951948c
commit 1f5cf157b1

View File

@@ -439,6 +439,78 @@ struct
INSERT_UPDATE (BRANCH (nodes, sizes)) INSERT_UPDATE (BRANCH (nodes, sizes))
end end
end end
else
let
val idx = BinSearch.equalOrMore (finish, sizes)
val idx = if idx = ~1 then 0 else idx
val prevSize =
if idx > 0 then
Vector.sub (sizes, idx - 1)
else
0
val descendStart = start - prevSize
val descendFinish = finish - prevSize
val descendNode = Vector.sub (nodes, idx)
in
case helpInsert (descendStart, descendFinish, descendNode) of
INSERT_UPDATE newNode =>
let
val sizes =
if finish > Vector.sub (sizes, idx) then
Vector.update (sizes, idx, finish)
else
sizes
val nodes = Vector.update (nodes, idx, newNode)
in
INSERT_UPDATE (BRANCH (nodes, sizes))
end
| INSERT_SPLIT (left, right) =>
if Vector.length nodes = maxSize then
(* have to split *)
let
val leftSize = getMaxSize left + prevSize
in
end
else
(* can join into parent *)
let
(* join size/metadata table, changing metadata where needed *)
val sizes =
let
val midLeftSize = getMaxSize left + prevSize
val midRightSize = getMaxSize right + midLeftSize
val origIdxSize = Vector.sub (sizes, idx)
val sizeDiff = midRightSize - origIdxSize
in
Vector.tabulate (Vector.length sizes + 1,
fn i =>
if i = idx then
midLeftSize
else if i = idx + 1 then
midRightSize
else if i < idx then
Vector.sub (sizes, i)
else
(* i > idx *)
Vector.sub (sizes, i - 1) + sizeDiff
)
end
val midNodes = #[left, right]
val midNodes = VectorSlice.full midNodes
val leftLen = SOME idx
val rightLen = SOME (Vector.length sizes - idx)
val leftNodes = VectorSlice.slice (nodes, 0, leftLen)
val rightNodes = VectorSlice.slice (nodes, idx, rightLen)
val nodes =
VectorSlice.concat [leftNodes, midNodes, rightNodes]
in
INSERT_UPDATE (BRANCH (nodes, sizes))
end
end
fun helpInsert (start, finish, tree) = fun helpInsert (start, finish, tree) =
case tree of case tree of