pub_just/
range_ext.rs

1use super::*;
2
3pub trait RangeExt<T> {
4  fn range_contains(&self, i: &T) -> bool;
5
6  fn display(&self) -> DisplayRange<&Self> {
7    DisplayRange(self)
8  }
9}
10
11pub struct DisplayRange<T>(T);
12
13impl Display for DisplayRange<&RangeInclusive<usize>> {
14  fn fmt(&self, f: &mut Formatter) -> fmt::Result {
15    if self.0.start() == self.0.end() {
16      write!(f, "{}", self.0.start())?;
17    } else if *self.0.end() == usize::MAX {
18      write!(f, "{} or more", self.0.start())?;
19    } else {
20      write!(f, "{} to {}", self.0.start(), self.0.end())?;
21    }
22    Ok(())
23  }
24}
25
26impl<T> RangeExt<T> for Range<T>
27where
28  T: PartialOrd,
29{
30  fn range_contains(&self, i: &T) -> bool {
31    i >= &self.start && i < &self.end
32  }
33}
34
35impl<T> RangeExt<T> for RangeInclusive<T>
36where
37  T: PartialOrd,
38{
39  fn range_contains(&self, i: &T) -> bool {
40    i >= self.start() && i <= self.end()
41  }
42}
43
44#[cfg(test)]
45mod tests {
46  use super::*;
47
48  #[test]
49  fn exclusive() {
50    assert!(!(0..0).range_contains(&0));
51    assert!(!(1..10).range_contains(&0));
52    assert!(!(1..10).range_contains(&10));
53    assert!(!(1..10).range_contains(&0));
54    assert!((0..1).range_contains(&0));
55    assert!((10..20).range_contains(&15));
56  }
57
58  #[test]
59  fn inclusive() {
60    assert!(!(0..=10).range_contains(&11));
61    assert!(!(1..=10).range_contains(&0));
62    assert!(!(5..=10).range_contains(&4));
63    assert!((0..=0).range_contains(&0));
64    assert!((0..=1).range_contains(&0));
65    assert!((0..=10).range_contains(&0));
66    assert!((0..=10).range_contains(&10));
67    assert!((0..=10).range_contains(&7));
68    assert!((1..=10).range_contains(&10));
69    assert!((10..=20).range_contains(&15));
70  }
71
72  #[test]
73  fn display() {
74    assert!(!(1..1).contains(&1));
75    assert!((1..1).is_empty());
76    assert!((5..5).is_empty());
77    assert_eq!((0..=0).display().to_string(), "0");
78    assert_eq!((1..=1).display().to_string(), "1");
79    assert_eq!((5..=5).display().to_string(), "5");
80    assert_eq!((5..=9).display().to_string(), "5 to 9");
81    assert_eq!((1..=usize::MAX).display().to_string(), "1 or more");
82  }
83}