use core::iter::Filter;
macro_rules! ty {
() => { Filter<Self, impl FnMut(&Self::Item) -> bool> };
}
pub trait FilterExt: Iterator + Sized {
fn filter_copied<F>(self, mut predicate: F) -> ty!()
where Self::Item: Copy,
F: FnMut(Self::Item) -> bool,
{
self.filter(move |&elem| predicate(elem))
}
fn filter_ne<T>(self, value: &T) -> ty!()
where Self::Item: PartialEq<T>,
{
self.filter(move |elem| elem != value)
}
fn filter_any<F>(self, mut f: F) -> ty!()
where for<'a> &'a Self::Item: IntoIterator,
F: FnMut(<&Self::Item as IntoIterator>::Item) -> bool,
{
self.filter(move |inner| inner.into_iter().any(&mut f))
}
fn filter_all<F>(self, mut f: F) -> ty!()
where for<'a> &'a Self::Item: IntoIterator,
F: FnMut(<&Self::Item as IntoIterator>::Item) -> bool,
{
self.filter(move |inner| inner.into_iter().all(&mut f))
}
fn exclude<F>(self, mut predicate: F) -> ty!()
where F: FnMut(&Self::Item) -> bool,
{
self.filter(move |elem| ! predicate(elem))
}
fn exclude_any<F>(self, mut f: F) -> ty!()
where for<'a> &'a Self::Item: IntoIterator,
F: FnMut(<&Self::Item as IntoIterator>::Item) -> bool,
{
self.exclude(move |inner| inner.into_iter().any(&mut f))
}
fn exclude_all<F>(self, mut f: F) -> ty!()
where for<'a> &'a Self::Item: IntoIterator,
F: FnMut(<&Self::Item as IntoIterator>::Item) -> bool,
{
self.exclude(move |inner| inner.into_iter().all(&mut f))
}
}
impl<I: Iterator> FilterExt for I {}
#[test]
fn it_works() {
let mut iter = [0, 1, 2, 3].iter().filter_ne(&&2);
assert_eq!(iter.next(), Some(&0));
assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next(), Some(&3));
assert_eq!(iter.next(), None);
}