use std::iter::Iterator;
pub enum Continue {
Continue,
Break,
}
impl Default for Continue {
fn default() -> Continue {
Continue::Continue
}
}
impl From<()> for Continue {
fn from(_: ()) -> Continue {
Continue::Continue
}
}
pub trait ForEach: Iterator {
fn foreach<O, F>(&mut self, f: F)
where
O: Into<Continue>,
F: FnMut(Self::Item, &mut Self) -> O;
}
impl<T: Iterator> ForEach for T {
fn foreach<O, F>(&mut self, mut f: F)
where
O: Into<Continue>,
F: FnMut(Self::Item, &mut Self) -> O,
{
loop {
let item = self.next();
if let Some(item) = item {
match f(item, self).into() {
Continue::Break => break,
_ => (),
}
} else {
break;
}
}
}
}
#[macro_export]
macro_rules! for_each {
($pat:pat in $iter:ident $code:block) => {
loop {
use std::iter::Iterator;
let __for_each_item = Iterator::next(&mut $iter);
if let Some($pat) = __for_each_item {
$code
} else {
break;
}
}
};
($item:ident in $iter:ident $code:block) => {
loop {
use std::iter::Iterator;
let $item = Iterator::next(&mut $iter);
if let Some($item) = $item {
$code
} else {
break;
}
}
};
}