enumoid 0.1.1

Enum Indexed Containers
Documentation
use crate::base::Enumoid;
use std::iter;
use std::marker;
use std::slice;

pub struct EnumSliceIter<'a, T, V: 'a> {
  pub(crate) _phantom: marker::PhantomData<T>,
  pub(crate) iter: iter::Enumerate<slice::Iter<'a, V>>,
}

impl<'a, T: Enumoid, V> EnumSliceIter<'a, T, V> {
  #[inline(always)]
  fn f(iv: (usize, &'a V)) -> (T, &'a V) {
    (T::from_usize(iv.0), iv.1)
  }
}

impl<'a, T: Enumoid, V> Iterator for EnumSliceIter<'a, T, V> {
  type Item = (T, &'a V);

  #[inline]
  fn next(&mut self) -> Option<Self::Item> {
    self.iter.next().map(Self::f)
  }

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

  #[inline]
  fn fold<B, F>(self, init: B, f: F) -> B
  where
    F: FnMut(B, Self::Item) -> B,
  {
    self.iter.map(Self::f).fold(init, f)
  }
}

pub struct EnumSliceIterMut<'a, T, V: 'a> {
  pub(crate) _phantom: marker::PhantomData<T>,
  pub(crate) iter: iter::Enumerate<slice::IterMut<'a, V>>,
}

impl<'a, T: Enumoid, V> EnumSliceIterMut<'a, T, V> {
  #[inline(always)]
  fn f(iv: (usize, &'a mut V)) -> (T, &'a mut V) {
    (T::from_usize(iv.0), iv.1)
  }
}

impl<'a, T: Enumoid, V> Iterator for EnumSliceIterMut<'a, T, V> {
  type Item = (T, &'a mut V);

  #[inline]
  fn next(&mut self) -> Option<Self::Item> {
    self.iter.next().map(Self::f)
  }

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

  #[inline]
  fn fold<B, F>(self, init: B, f: F) -> B
  where
    F: FnMut(B, Self::Item) -> B,
  {
    self.iter.map(Self::f).fold(init, f)
  }
}