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}