use crate::AsyncIterator;
#[must_use = "iterators are lazy and do nothing unless consumed"]
#[derive(Debug, Clone)]
pub struct Fuse<I> {
inner: Option<I>,
}
impl<I> Fuse<I> {
#[inline]
pub fn new(inner: I) -> Fuse<I> {
Self { inner: Some(inner) }
}
}
impl<I> AsyncIterator for Fuse<I>
where
I: AsyncIterator,
{
type Item = I::Item;
async fn next(&mut self) -> Option<I::Item> {
match self.inner.take() {
Some(mut it) => match it.next().await {
Some(val) => {
self.inner = Some(it);
Some(val)
}
None => None,
},
None => None,
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
match self.inner {
Some(ref inner) => inner.size_hint(),
None => (0, Some(0)),
}
}
}