itertools/
repeatn.rs
1
2#[must_use = "iterators are lazy and do nothing unless consumed"]
6#[derive(Debug)]
7pub struct RepeatN<A> {
8 elt: Option<A>,
9 n: usize,
10}
11
12pub fn repeat_n<A>(element: A, n: usize) -> RepeatN<A>
14 where A: Clone,
15{
16 if n == 0 {
17 RepeatN { elt: None, n: n, }
18 } else {
19 RepeatN { elt: Some(element), n: n, }
20 }
21}
22
23impl<A> Iterator for RepeatN<A>
24 where A: Clone
25{
26 type Item = A;
27
28 fn next(&mut self) -> Option<Self::Item> {
29 if self.n > 1 {
30 self.n -= 1;
31 self.elt.as_ref().cloned()
32 } else {
33 self.n = 0;
34 self.elt.take()
35 }
36 }
37
38 fn size_hint(&self) -> (usize, Option<usize>) {
39 (self.n, Some(self.n))
40 }
41}
42
43impl<A> DoubleEndedIterator for RepeatN<A>
44 where A: Clone
45{
46 #[inline]
47 fn next_back(&mut self) -> Option<Self::Item> {
48 self.next()
49 }
50}
51
52impl<A> ExactSizeIterator for RepeatN<A>
53 where A: Clone
54{}