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(Clone, Debug)]
7 pub struct RepeatN<A> {
8 elt: Option<A>,
9 n: usize,
10 }
11
12 /// Create an iterator that produces `n` repetitions of `element`.
repeat_n<A>(element: A, n: usize) -> RepeatN<A> where A: Clone,13 pub fn repeat_n<A>(element: A, n: usize) -> RepeatN<A>
14 where A: Clone,
15 {
16 if n == 0 {
17 RepeatN { elt: None, n, }
18 } else {
19 RepeatN { elt: Some(element), n, }
20 }
21 }
22
23 impl<A> Iterator for RepeatN<A>
24 where A: Clone
25 {
26 type Item = A;
27
next(&mut self) -> Option<Self::Item>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
size_hint(&self) -> (usize, Option<usize>)38 fn size_hint(&self) -> (usize, Option<usize>) {
39 (self.n, Some(self.n))
40 }
41 }
42
43 impl<A> DoubleEndedIterator for RepeatN<A>
44 where A: Clone
45 {
46 #[inline]
next_back(&mut self) -> Option<Self::Item>47 fn next_back(&mut self) -> Option<Self::Item> {
48 self.next()
49 }
50 }
51
52 impl<A> ExactSizeIterator for RepeatN<A>
53 where A: Clone
54 {}
55