indexland 0.2.0

Rust Collections with Newtype Indices
use crate::Idx;

pub struct IdxEnumerate<I, IT> {
    pos: I,
    base_iter: IT,
}

impl<I: Idx, IT: Iterator> IdxEnumerate<I, IT> {
    pub fn new(pos: I, base_iter: impl IntoIterator<IntoIter = IT>) -> Self {
        Self {
            pos,
            base_iter: base_iter.into_iter(),
        }
    }
}

impl<I: Idx, IT: Iterator> Iterator for IdxEnumerate<I, IT> {
    type Item = (I, IT::Item);

    fn next(&mut self) -> Option<Self::Item> {
        let value = self.base_iter.next()?;
        let idx = self.pos;
        self.pos = I::from_usize(self.pos.into_usize() + 1);
        Some((idx, value))
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.base_iter.size_hint()
    }

    fn count(self) -> usize
    where
        Self: Sized,
    {
        self.base_iter.count()
    }

    fn nth(&mut self, n: usize) -> Option<Self::Item> {
        match self.base_iter.nth(n) {
            Some(v) => {
                let pos = self.pos;
                self.pos += I::from_usize(n + 1);
                Some((pos + I::from_usize(n), v))
            }
            None => None,
        }
    }
}