almost done implementing 'helpInsert' for LEAF case of persistent-vector.sml
This commit is contained in:
@@ -412,6 +412,70 @@ struct
|
|||||||
INSERT_UPDATE (BRANCH (nodes, sizes))
|
INSERT_UPDATE (BRANCH (nodes, sizes))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
| LEAF (items, sizes) =>
|
||||||
|
if Vector.length items = 0 then
|
||||||
|
(* leaf is empty, so return leaf containing one item *)
|
||||||
|
let
|
||||||
|
val item = #[{start = start, finish = finish}]
|
||||||
|
val size = #[finish]
|
||||||
|
in
|
||||||
|
INSERT_UPDATE (LEAF (item, size))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if finish > Vector.sub (sizes, Vector.length sizes - 1) then
|
||||||
|
if Vector.length sizes = maxSize then
|
||||||
|
(* have to split *)
|
||||||
|
raise Fail "umimp"
|
||||||
|
else
|
||||||
|
(* can just append *)
|
||||||
|
let
|
||||||
|
val sizes = Vector.concat [sizes, #[finish]]
|
||||||
|
val item = #[{start = start, finish = finish}]
|
||||||
|
val items = Vector.concat [items, item]
|
||||||
|
in
|
||||||
|
INSERT_UPDATE (LEAF (items, sizes))
|
||||||
|
end
|
||||||
|
else if finish < #start (Vector.sub (items, 0)) then
|
||||||
|
(* prepend *)
|
||||||
|
if Vector.length sizes = maxSize then
|
||||||
|
(* have to split *)
|
||||||
|
raise Fail "umimp"
|
||||||
|
else
|
||||||
|
(* just prepend *)
|
||||||
|
let
|
||||||
|
val sizes = Vector.concat [#[finish], sizes]
|
||||||
|
val item = {start = start, finish = finish}
|
||||||
|
val items = Vector.concat [#[item], items]
|
||||||
|
in
|
||||||
|
INSERT_UPDATE (LEAF (items, sizes))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
(* insert into middle *)
|
||||||
|
let
|
||||||
|
val idx = BinSearch.equalOrMore (finish, sizes)
|
||||||
|
val leftLen = SOME idx
|
||||||
|
val rightLen = SOME (idx - Vector.length sizes)
|
||||||
|
|
||||||
|
val leftSizes = VectorSlice.slice (sizes, 0, leftLen)
|
||||||
|
val rightSizes = VectorSlice.slice (sizes, idx, rightLen)
|
||||||
|
|
||||||
|
val leftItems = VectorSlice.slice (items, 0, leftLen)
|
||||||
|
val rightItems = VectorSlice.slice (items, idx, rightLen)
|
||||||
|
in
|
||||||
|
if Vector.length items = maxSize then
|
||||||
|
(* have to return split *)
|
||||||
|
raise Fail "umimp"
|
||||||
|
else
|
||||||
|
(* have to return update *)
|
||||||
|
let
|
||||||
|
val midSize = VectorSlice.full #[finish]
|
||||||
|
val sizes = VectorSlice.concat [leftSizes, midSize, rightSizes]
|
||||||
|
val midItem = VectorSlice.full #[{start = start, finish = finish}]
|
||||||
|
val items = VectorSlice.concat [leftItems, midItem, rightItems]
|
||||||
|
in
|
||||||
|
INSERT_UPDATE (LEAF (items, sizes))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
fun insert (start, finish, tree) =
|
fun insert (start, finish, tree) =
|
||||||
case helpInsert (start, finish, tree) of
|
case helpInsert (start, finish, tree) of
|
||||||
|
|||||||
Reference in New Issue
Block a user