pub trait BidirIterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
fn prev(&mut self) -> Option<Self::Item>;
fn forward(&mut self) -> Forward<&mut Self>
where
Self: Sized,
{
Forward { iter: self }
}
fn forward_owned(self) -> Forward<Self>
where
Self: Sized,
{
Forward { iter: self }
}
fn backward(&mut self) -> Backward<&mut Self>
where
Self: Sized,
{
Backward { iter: self }
}
fn backward_owned(self) -> Backward<Self>
where
Self: Sized,
{
Backward { iter: self }
}
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
Self: Sized,
P: FnMut(&Self::Item) -> bool,
{
Filter {
iter: self,
predicate,
}
}
fn map<B, F>(self, f: F) -> Map<Self, F>
where
Self: Sized,
F: FnMut(Self::Item) -> B,
{
Map { iter: self, f }
}
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where
Self: Sized,
F: FnMut(Self::Item) -> Option<B>,
{
FilterMap { iter: self, f }
}
}
impl<T> BidirIterator for &mut T
where
T: BidirIterator,
{
type Item = T::Item;
fn next(&mut self) -> Option<Self::Item> {
(*self).next()
}
fn prev(&mut self) -> Option<Self::Item> {
(*self).prev()
}
}
pub struct Forward<T> {
iter: T,
}
impl<B> Iterator for Forward<B>
where
B: BidirIterator,
{
type Item = B::Item;
fn next(&mut self) -> Option<B::Item> {
self.iter.next()
}
}
pub struct Backward<B> {
iter: B,
}
impl<B> Iterator for Backward<B>
where
B: BidirIterator,
{
type Item = B::Item;
fn next(&mut self) -> Option<B::Item> {
self.iter.prev()
}
}
pub struct Filter<B, P> {
iter: B,
predicate: P,
}
impl<B: BidirIterator, P> BidirIterator for Filter<B, P>
where
P: FnMut(&B::Item) -> bool,
{
type Item = B::Item;
fn next(&mut self) -> Option<B::Item> {
while let Some(i) = self.iter.next() {
if (self.predicate)(&i) {
return Some(i);
}
}
None
}
fn prev(&mut self) -> Option<B::Item> {
while let Some(i) = self.iter.prev() {
if (self.predicate)(&i) {
return Some(i);
}
}
None
}
}
pub struct Map<I, F> {
iter: I,
f: F,
}
impl<B, I: BidirIterator, F> BidirIterator for Map<I, F>
where
F: FnMut(I::Item) -> B,
{
type Item = B;
fn next(&mut self) -> Option<B> {
self.iter.next().map(&mut self.f)
}
fn prev(&mut self) -> Option<B> {
self.iter.prev().map(&mut self.f)
}
}
pub struct FilterMap<I, F> {
iter: I,
f: F,
}
impl<B, I: BidirIterator, F> BidirIterator for FilterMap<I, F>
where
F: FnMut(I::Item) -> Option<B>,
{
type Item = B;
fn next(&mut self) -> Option<B> {
while let Some(a) = self.iter.next() {
if let Some(b) = (self.f)(a) {
return Some(b);
}
}
None
}
fn prev(&mut self) -> Option<B> {
while let Some(a) = self.iter.prev() {
if let Some(b) = (self.f)(a) {
return Some(b);
}
}
None
}
}