use crate::serialisation::{SerError, TryClone};
pub trait IterExtras: Iterator + Sized {
fn for_each_with<T, F>(mut self, t: T, mut f: F)
where
T: Clone,
F: FnMut(Self::Item, T),
{
let mut current: Option<Self::Item> = self.next();
let mut next: Option<Self::Item> = self.next();
while next.is_some() {
let item = current.take().unwrap();
f(item, t.clone());
current = next;
next = self.next();
}
if let Some(item) = current.take() {
f(item, t)
}
}
fn for_each_try_with<T, F>(mut self, t: T, mut f: F) -> Result<(), SerError>
where
T: TryClone,
F: FnMut(Self::Item, T),
{
let mut current: Option<Self::Item> = self.next();
let mut next: Option<Self::Item> = self.next();
while next.is_some() {
let item = current.take().unwrap();
let cloned = t.try_clone()?;
f(item, cloned);
current = next;
next = self.next();
}
if let Some(item) = current.take() {
f(item, t)
}
Ok(())
}
}
impl<T: Sized> IterExtras for T where T: Iterator {}