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:
@@ -359,6 +359,49 @@ struct
|
|||||||
LEAF (_, sizes) => Vector.sub (sizes, Vector.length sizes - 1)
|
LEAF (_, sizes) => Vector.sub (sizes, Vector.length sizes - 1)
|
||||||
| BRANCH (_, 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) =
|
fun helpInsert (start, finish, tree) =
|
||||||
case tree of
|
case tree of
|
||||||
BRANCH (nodes, sizes) =>
|
BRANCH (nodes, sizes) =>
|
||||||
@@ -468,7 +511,8 @@ struct
|
|||||||
if Vector.length nodes = maxSize then
|
if Vector.length nodes = maxSize then
|
||||||
(* have to split *)
|
(* have to split *)
|
||||||
let
|
let
|
||||||
val leftSize = getMaxSize left + prevSize
|
val leftSizes =
|
||||||
|
insertSplitSizesLeft (idx, sizes, left, right, prevSize)
|
||||||
in
|
in
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user