use crate::Idx;
pub struct IterIndexed<'a, T> {
inner: std::iter::Enumerate<std::slice::Iter<'a, T>>,
}
impl<'a, T> IterIndexed<'a, T> {
#[must_use]
pub const fn new(inner: std::iter::Enumerate<std::slice::Iter<'a, T>>) -> Self {
Self { inner }
}
}
impl<'a, T> Iterator for IterIndexed<'a, T> {
type Item = (Idx<T>, &'a T);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<T> ExactSizeIterator for IterIndexed<'_, T> {}
pub struct IterIndexedMut<'a, T> {
inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>,
}
impl<'a, T> IterIndexedMut<'a, T> {
#[must_use]
pub const fn new(inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>) -> Self {
Self { inner }
}
}
impl<'a, T> Iterator for IterIndexedMut<'a, T> {
type Item = (Idx<T>, &'a mut T);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<T> ExactSizeIterator for IterIndexedMut<'_, T> {}