use crate::AsyncIterator;
#[derive(Clone, Debug)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Cycle<I> {
orig: I,
iter: I,
}
impl<I: Clone> Cycle<I> {
pub fn new(iter: I) -> Cycle<I> {
Cycle {
orig: iter.clone(),
iter,
}
}
}
impl<I: AsyncIterator + Clone> AsyncIterator for Cycle<I> {
type Item = I::Item;
#[inline]
async fn next(&mut self) -> Option<I::Item> {
match self.iter.next().await {
None => {
self.iter = self.orig.clone();
self.iter.next().await
}
y => y,
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
match self.orig.size_hint() {
sz @ (0, Some(0)) => sz,
(0, _) => (0, None),
_ => (usize::MAX, None),
}
}
}