From 79fda65f78f5cb0dccbcb7fa2826dbedc076a653 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Thu, 15 Jan 2026 05:51:22 +0000 Subject: [PATCH] begin coding 'PersistentVector.splitLeft' function --- fcore/persistent-vector.sml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/fcore/persistent-vector.sml b/fcore/persistent-vector.sml index ef7bc1d..98225d0 100644 --- a/fcore/persistent-vector.sml +++ b/fcore/persistent-vector.sml @@ -327,4 +327,40 @@ struct else loopPrevMatch (start, finish, tree, count - 1) end + + fun splitLeft (cursorIdx, tree) = + case tree of + LEAF (items, sizes) => + if Vector.length items = 0 then + (* if tree is empty, then just return tree *) + tree + else + let + val {start, ...} = Vector.sub (items, 0) + in + (* if all items are after cursorIdx, + * then we want to return an empty tree, + * splitting everything *) + if cursorIdx < start then + empty + else if cursorIdx > Vector.sub (sizes, Vector.length sizes - 1) then + (* if all items are before cursorIdx, + * then we want to return the same tree, + * splitting nothing *) + tree + else + (* we want to split from somewhere in middle, keeping left *) + let + val idx = BinSearch.equalOrMore (cursorIdx, sizes) + val idx = SOME idx + + val items = VectorSlice.slice (items, 0, idx) + val items = VectorSlice.vector items + + val sizes = VectorSlice.slice (sizes, 0, idx) + val sizes = VectorSlice.vector sizes + in + LEAF (items, sizes) + end + end end