diff --git a/src/custom_range_bounds_ord_wrapper.rs b/src/custom_range_bounds_ord_wrapper.rs index a5c13ae..2a49743 100644 --- a/src/custom_range_bounds_ord_wrapper.rs +++ b/src/custom_range_bounds_ord_wrapper.rs @@ -24,13 +24,25 @@ use std::ops::RangeBounds; use crate::bound_ord::BoundOrd; +#[derive(Clone)] +pub struct BoundOrdBodge { + bound_ord: BoundOrd +} + +impl OrdBodge for BoundOrdBodge { + fn cmp(&self, other: &K) -> Ordering { + Ordering::Less + } +} + pub trait OrdBodge { fn cmp(&self, other: &K) -> Ordering; } pub enum CustomRangeBoundsOrdWrapper { RangeBounds(K), - OrdBodge(Box>, PhantomData), + OrdBodge(Box>), + PhantomData(PhantomData) } impl CustomRangeBoundsOrdWrapper { diff --git a/src/range_bounds_map.rs b/src/range_bounds_map.rs index 1ab3b08..b50cef7 100644 --- a/src/range_bounds_map.rs +++ b/src/range_bounds_map.rs @@ -31,7 +31,9 @@ use serde::ser::SerializeMap; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::bound_ord::BoundOrd; -use crate::custom_range_bounds_ord_wrapper::CustomRangeBoundsOrdWrapper; +use crate::custom_range_bounds_ord_wrapper::{ + BoundOrdBodge, CustomRangeBoundsOrdWrapper, +}; use crate::helpers::is_valid_range_bounds; use crate::TryFromBounds; @@ -269,7 +271,11 @@ pub enum OverlapOrTryFromBoundsError { TryFromBounds(TryFromBoundsError), } -impl RangeBoundsMap { +impl RangeBoundsMap +where + I: Ord + Clone, + K: RangeBounds, +{ /// Makes a new, empty `RangeBoundsMap`. /// /// # Examples @@ -418,11 +424,41 @@ impl RangeBoundsMap { /// ); /// ``` #[tested] - pub fn overlapping(&self, range_bounds: Q) + pub fn overlapping( + &self, + range_bounds: Q, + ) -> ( + Bound, + Bound, + impl DoubleEndedIterator, + ) where Q: RangeBounds, { - todo!() + let start_bound = range_bounds.start_bound().cloned(); + + let end_bound = range_bounds.end_bound().cloned(); + + let start_bodge = Box::new(BoundOrdBodge { + bound_ord: BoundOrd::start(start_bound), + }); + let end_bodge = Box::new(BoundOrdBodge { + bound_ord: BoundOrd::start(end_bound), + }); + + let result = self + .inner + .range(( + Bound::Included(CustomRangeBoundsOrdWrapper::OrdBodge( + start_bodge.clone(), + )), + Bound::Included(CustomRangeBoundsOrdWrapper::OrdBodge( + end_bodge.clone(), + )), + )) + .map(move |(key, value)| (key.rxr(), value)); + + return (start_bound, end_bound, result); } /// Returns a reference to the `Value` corresponding to the