diff --git a/Cargo.lock b/Cargo.lock index e486af4..16c90d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,7 +36,7 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "discrete_range_map" -version = "0.5.0" +version = "0.5.1" dependencies = [ "btree_monstrousity", "either", diff --git a/src/discrete_range_map.rs b/src/discrete_range_map.rs index fd5661e..8e9a165 100644 --- a/src/discrete_range_map.rs +++ b/src/discrete_range_map.rs @@ -1205,6 +1205,42 @@ where } return Ok(map); } + + /// Collects a `DiscreteRangeMap` from an iterator of (range, + /// value) tuples using [`DiscreteRangeMap::insert_strict()`]. + /// + /// May return an `Err` while inserting. See + /// [`DiscreteRangeMap::insert_strict()`] for details. + /// + /// # Panics + /// + /// Panics if the given range is an invalid range. See [`Invalid + /// Ranges`](https://docs.rs/discrete_range_map/latest/discrete_range_map/index.html#invalid-ranges) + /// for more details. + /// + /// # Examples + /// ``` + /// use discrete_range_map::test_ranges::ie; + /// use discrete_range_map::DiscreteRangeMap; + /// + /// let slice = + /// [(ie(1, 4), false), (ie(4, 8), true), (ie(8, 100), false)]; + /// + /// let map: DiscreteRangeMap<_, _, _> = + /// DiscreteRangeMap::from_iter_strict( + /// slice.into_iter().filter(|(range, _)| range.start > 2), + /// ) + /// .unwrap(); + /// ``` + pub fn from_iter_strict( + iter: impl Iterator, + ) -> Result, OverlapError> { + let mut map = DiscreteRangeMap::new(); + for (range, value) in iter { + map.insert_strict(range, value)?; + } + return Ok(map); + } } impl DiscreteRangeMap { diff --git a/src/discrete_range_set.rs b/src/discrete_range_set.rs index 3fb6c94..9183a48 100644 --- a/src/discrete_range_set.rs +++ b/src/discrete_range_set.rs @@ -122,6 +122,16 @@ where } return Ok(set); } + /// See [`DiscreteRangeMap::from_iter_strict()`] for more details. + pub fn from_iter_strict( + iter: impl Iterator, + ) -> Result, OverlapError> { + let mut set = DiscreteRangeSet::new(); + for range in iter { + set.insert_strict(range)?; + } + return Ok(set); + } } impl DiscreteRangeSet {