]> git.proxmox.com Git - rustc.git/blob - vendor/itertools/src/repeatn.rs
New upstream version 1.33.0+dfsg1
[rustc.git] / vendor / itertools / src / 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)]
7 pub struct RepeatN<A> {
8 elt: Option<A>,
9 n: usize,
10 }
11
12 /// Create an iterator that produces `n` repetitions of `element`.
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: n, }
18 } else {
19 RepeatN { elt: Some(element), n: n, }
20 }
21 }
22
23 impl<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
43 impl<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
52 impl<A> ExactSizeIterator for RepeatN<A>
53 where A: Clone
54 {}