From 6f406069a841eb6fd34b51ccc84ae5c5b88ff04f Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Thu, 23 Oct 2025 06:32:17 +0100 Subject: [PATCH] add function to split right of vector --- src/rrb_rope.sml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/rrb_rope.sml b/src/rrb_rope.sml index c80381a..414c002 100644 --- a/src/rrb_rope.sml +++ b/src/rrb_rope.sml @@ -122,4 +122,32 @@ struct in LEAF items end + + fun splitKeepingRight (idx, level, tree) = + case tree of + BRANCH nodes => + let + val w = Word.>> (idx, level) + val w = Word.andb (w, mask) + val nodeIdx = Word.toInt w + + val node = Vector.sub (nodes, nodeIdx) + val newNode = splitKeepingRight (idx, level - bits, node) + val newNode = Vector.fromList [newNode] + val newNode = VectorSlice.full newNode + + val newNodes = VectorSlice.slice (nodes, nodeIdx, NONE) + val newNodes = VectorSlice.concat [newNode, newNodes] + in + BRANCH newNodes + end + | LEAF items => + let + val w = Word.andb (idx, mask) + val idx = Word.toInt w + val items = VectorSlice.slice (items, idx, NONE) + val items = VectorSlice.vector items + in + LEAF items + end end