From 8e6f2edcc20246d59f001a8dcab0283b154ba7b8 Mon Sep 17 00:00:00 2001
From: Eduardo Trujillo <ed@chromabits.com>
Date: Sun, 23 Mar 2025 20:40:03 +0000
Subject: [PATCH] feat(rangemap): Add overlaps function

---
 src/rangemap.rs | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/src/rangemap.rs b/src/rangemap.rs
index 2d54668..d29f757 100644
--- a/src/rangemap.rs
+++ b/src/rangemap.rs
@@ -100,6 +100,25 @@ impl<RK: Ord + Copy, V> RangeMap<RK, V> {
         None
     }
 
+    /// Checks whether the provided range has any overlaps.
+    pub fn overlaps(&self, start: RK, end: RK) -> bool {
+        if let Some((&_existing_start, &(existing_end, _))) =
+            self.ranges.range(..=start).next_back()
+        {
+            if existing_end >= start {
+                return true;
+            }
+        }
+
+        if let Some((&existing_start, &(_, _))) = self.ranges.range(start..).next() {
+            if existing_start <= end {
+                return true;
+            }
+        }
+
+        false
+    }
+
     /// Looks up a value at the specified key and removes it from the
     /// dictionary.
     ///
@@ -261,4 +280,24 @@ mod tests {
 
         Ok(())
     }
+
+    #[test]
+    pub fn test_overlaps() -> anyhow::Result<()> {
+        let mut rm: RangeMap<i64, &str> = RangeMap::new();
+
+        rm.insert(0, 10, "A")?;
+
+        assert!(rm.overlaps(10, 13));
+        assert!(rm.overlaps(5, 7));
+        assert!(rm.overlaps(-20, 0));
+        assert!(rm.overlaps(-20, 20));
+        assert!(!rm.overlaps(50, 70));
+        assert!(!rm.overlaps(-50, -10));
+
+        rm.insert(400, 500, "B")?;
+
+        assert!(rm.overlaps(40, 450));
+
+        Ok(())
+    }
 }
-- 
GitLab