use fluent_result::into::IntoResult;
use tap::Pipe;
use crate::errors::TupleExtendError;
use crate::{TryExtend, TryExtendOne};
use crate::errors::types::Either;
#[cfg(doc)]
use crate::TryUnzip;
impl<TryFromA, TryFromB, I> TryExtend<I> for (TryFromA, TryFromB)
where
I: IntoIterator<Item = (TryFromA::Item, TryFromB::Item)>,
TryFromA: TryExtendOne + Default,
TryFromB: TryExtendOne + Default,
{
type Error = Either<
TupleExtendError<TryFromA::Error, TryFromB::Item, I::IntoIter>,
TupleExtendError<TryFromB::Error, TryFromA::Item, I::IntoIter>,
>;
fn try_extend(&mut self, iter: I) -> Result<(), Self::Error> {
let mut iter = iter.into_iter();
for (a, b) in iter.by_ref() {
if let Err(error) = self.0.try_extend_one(a) {
return TupleExtendError::new(error, Some(b), iter).pipe(Either::Left).into_err();
}
if let Err(error) = self.1.try_extend_one(b) {
return TupleExtendError::new(error, None, iter).pipe::<Self::Error>(Either::Right).into_err();
}
}
Ok(())
}
}