From 62ae098b599ee3b0cb993c8547129fd309caadb8 Mon Sep 17 00:00:00 2001
From: Eduardo Trujillo <ed@chromabits.com>
Date: Sun, 16 Mar 2025 21:53:11 +0000
Subject: [PATCH] feat(rangemap): Add iterator

---
 src/rangemap.rs | 17 +++++++++++++++++
 src/rangeset.rs |  2 +-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/rangemap.rs b/src/rangemap.rs
index 91eef9a..8c58716 100644
--- a/src/rangemap.rs
+++ b/src/rangemap.rs
@@ -84,6 +84,23 @@ impl<RK: Ord + Copy, V> RangeMap<RK, V> {
 
         None
     }
+
+    /// Returns all stored ranges, sorted by key.
+    pub fn iter(&self) -> impl Iterator<Item = ((RK, RK), &V)> + '_ {
+        self.ranges
+            .iter()
+            .map(|(&s, value)| ((s, value.0), &value.1))
+    }
+
+    /// Returns the number of elements in the map.
+    pub fn len(&self) -> usize {
+        self.ranges.len()
+    }
+
+    /// Returns whether this map is empty.
+    pub fn is_empty(&self) -> bool {
+        self.ranges.is_empty()
+    }
 }
 
 impl<RK: Ord + Copy, V> Default for RangeMap<RK, V> {
diff --git a/src/rangeset.rs b/src/rangeset.rs
index 49de772..f6e52d8 100644
--- a/src/rangeset.rs
+++ b/src/rangeset.rs
@@ -69,7 +69,7 @@ impl<RK: Ord + Copy> RangeSet<RK> {
         false
     }
 
-    /// Returns all stored ranges.
+    /// Returns all stored ranges, sorted by key.
     pub fn iter(&self) -> impl Iterator<Item = (RK, RK)> + '_ {
         self.ranges.iter().map(|(&s, &e)| (s, e))
     }
-- 
GitLab