use std::iter::FusedIterator;
/// An iterator that produces *n* repetitions of an element.
///
/// See [`repeat_n()`](crate::repeat_n) for more information.
#[must_use = "iterators are lazy and do nothing unless consumed"]
#[derive(Clone, Debug)]
pub struct RepeatN {
elt: Option,
n: usize,
}
/// Create an iterator that produces `n` repetitions of `element`.
pub fn repeat_n(element: A, n: usize) -> RepeatN
where A: Clone,
{
if n == 0 {
RepeatN { elt: None, n, }
} else {
RepeatN { elt: Some(element), n, }
}
}
impl Iterator for RepeatN
where A: Clone
{
type Item = A;
fn next(&mut self) -> Option {
if self.n > 1 {
self.n -= 1;
self.elt.as_ref().cloned()
} else {
self.n = 0;
self.elt.take()
}
}
fn size_hint(&self) -> (usize, Option) {
(self.n, Some(self.n))
}
}
impl DoubleEndedIterator for RepeatN
where A: Clone
{
#[inline]
fn next_back(&mut self) -> Option {
self.next()
}
}
impl ExactSizeIterator for RepeatN
where A: Clone
{}
impl FusedIterator for RepeatN
where A: Clone
{}