use super::cell::MergeCell;
use super::{Error, Merge};
pub trait IteratorExt: Iterator {
fn merge(self) -> Result<Self::Item, Error>
where
Self::Item: Merge,
Self: Sized;
fn try_merge(self) -> Option<Result<Self::Item, Error>>
where
Self::Item: Merge,
Self: Sized;
}
impl<I> IteratorExt for I
where
I: Iterator,
{
fn merge(self) -> Result<Self::Item, Error>
where
Self::Item: Merge,
Self: Sized,
{
self.try_merge()
.expect("tried to .merge() an empty iterator")
}
fn try_merge(self) -> Option<Result<Self::Item, Error>>
where
Self::Item: Merge,
Self: Sized,
{
let mut cell = MergeCell::empty();
for item in self {
cell.merge(item);
}
cell.try_finish()
}
}