Optimize Chunks::seek when offset is in current chunk (#37659)

Michael Sloan created

Release Notes:

- N/A

Change summary

crates/rope/src/rope.rs | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)

Detailed changes

crates/rope/src/rope.rs 🔗

@@ -639,18 +639,20 @@ impl<'a> Chunks<'a> {
     pub fn seek(&mut self, mut offset: usize) {
         offset = offset.clamp(self.range.start, self.range.end);
 
-        let bias = if self.reversed {
-            Bias::Left
+        if self.reversed {
+            if offset > self.chunks.end() {
+                self.chunks.seek_forward(&offset, Bias::Left);
+            } else if offset <= *self.chunks.start() {
+                self.chunks.seek(&offset, Bias::Left);
+            }
         } else {
-            Bias::Right
+            if offset >= self.chunks.end() {
+                self.chunks.seek_forward(&offset, Bias::Right);
+            } else if offset < *self.chunks.start() {
+                self.chunks.seek(&offset, Bias::Right);
+            }
         };
 
-        if offset >= self.chunks.end() {
-            self.chunks.seek_forward(&offset, bias);
-        } else {
-            self.chunks.seek(&offset, bias);
-        }
-
         self.offset = offset;
     }