use std::fmt::Debug;
use std::iter::FromIterator;
pub trait TryCollect: Iterator {
fn try_collect<C, M>(self) -> Result<C, C::Error>
where
C: TryFromIterator<Self::Item, M>,
Self: Sized,
{
C::try_from_iter(self)
}
}
impl<T> TryCollect for T where T: Iterator + ?Sized {}
pub trait TryFromIterator<A, Marker> {
type Error: Debug;
fn try_from_iter<T>(iter: T) -> Result<Self, Self::Error>
where
Self: Sized,
T: IntoIterator<Item = A>;
}
#[derive(Debug, Clone)]
#[doc(hidden)]
pub struct Collect;
impl<S, A> TryFromIterator<A, Collect> for S
where
S: FromIterator<A>,
{
type Error = ();
fn try_from_iter<T>(iter: T) -> Result<Self, Self::Error>
where
Self: Sized,
T: IntoIterator<Item = A>,
{
Ok(FromIterator::from_iter(iter))
}
}
#[derive(Debug, Clone)]
#[doc(hidden)]
pub struct StringCollect;
impl TryFromIterator<u8, StringCollect> for String {
type Error = std::string::FromUtf8Error;
fn try_from_iter<T>(iter: T) -> Result<Self, Self::Error>
where
Self: Sized,
T: IntoIterator<Item = u8>,
{
String::from_utf8(iter.into_iter().collect())
}
}