use fallible_iterator::FallibleIterator;
use std::iter::Iterator;
use std::marker::PhantomData;
pub trait MakeFallible: Iterator + Sized {
fn make_fallible<E>(self) -> Convert<Self, E>;
}
impl<T> MakeFallible for T
where
T: Iterator,
{
fn make_fallible<E>(self) -> Convert<Self, E> {
Convert {
inner: self,
_phantom: PhantomData,
}
}
}
pub struct Convert<Iter: Iterator, E> {
inner: Iter,
_phantom: PhantomData<E>,
}
impl<Iter: Iterator, E> FallibleIterator for Convert<Iter, E> {
type Item = Iter::Item;
type Error = E;
fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
Ok(self.inner.next())
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}