itertools/
repeatn.rs

1
2/// An iterator that produces *n* repetitions of an element.
3///
4/// See [`repeat_n()`](../fn.repeat_n.html) for more information.
5#[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
12/// Create an iterator that produces `n` repetitions of `element`.
13pub 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{}