bidir_iter 0.2.1

Bidirectional iterators
Documentation
use crate::bidir_iterator::BidirIterator;

pub trait BidirIterate {
    type Item;
    type BidirIter: BidirIterator<Item = Self::Item>;

    fn bidir_iter(&self) -> Self::BidirIter;
}

pub struct BiIter<'a, T> {
    next: usize,
    slice: &'a [T],
}

impl<'a, T> BidirIterator for BiIter<'a, T> {
    type Item = &'a T;
    fn next(&mut self) -> Option<&'a T> {
        let x = self.slice.get(self.next);
        self.next += 1;
        x
    }

    fn prev(&mut self) -> Option<&'a T> {
        if self.next <= 1 {
            self.next = 0;
            None
        } else {
            self.next -= 1;
            self.slice.get(self.next - 1)
        }
    }
}

impl<'a, T> BidirIterate for &'a [T] {
    type Item = &'a T;
    type BidirIter = BiIter<'a, T>;

    fn bidir_iter(&self) -> Self::BidirIter {
        BiIter {
            next: 0,
            slice: self,
        }
    }
}