1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use std::ops::Range;

#[derive(Clone, Hash, Eq, PartialEq)]
pub struct NonemptyRange {
  pub start: usize,
  pub size_minus_one: usize,
}

impl IntoIterator for NonemptyRange {
  type Item = usize;
  type IntoIter = Range<usize>;
  fn into_iter(self) -> Self::IntoIter {
    self.start..self.size_minus_one + self.start + 1
  }
}

#[test]
fn test_nonempty_range_into_iterator() {
  assert!(
    NonemptyRange {
      start: 5,
      size_minus_one: 2
    }
    .into_iter()
    .eq([5, 6, 7].into_iter().cloned())
  )
}