keepops 0.0.2

Extension traits for keeping the input of mapping functions
Documentation
use std::marker::PhantomData;

use crate::keep_map_tuple::KeepMapTuple;
use crate::tuple_family::{RunTuple, TupleFamily};

#[derive(Clone)]
pub struct KeepTupleMap<I, F, ExtraDim> {
    pub(crate) iter: I,
    f: F,
    unused: PhantomData<ExtraDim>,
}

impl<I, F, A, ExtraDim> Iterator for KeepTupleMap<I, F, ExtraDim>
where
    I: Iterator<Item = A>,
    F: FnMut(&I::Item) -> ExtraDim,
    A: TupleFamily<ExtraDim>,
{
    type Item = RunTuple<A, ExtraDim>;
    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next().keep_tuple_map(&mut self.f)
    }
}

pub trait KeepMapTupleIteratorExtension: Iterator {
    fn keep_tuple_map<F, B, ExtraDim>(self, f: F) -> KeepTupleMap<Self, F, ExtraDim>
    where
        F: FnMut(&Self::Item) -> B,
        Self: Sized,
    {
        KeepTupleMap {
            iter: self,
            f,
            unused: PhantomData::default(),
        }
    }
}

impl<I: Iterator> KeepMapTupleIteratorExtension for I {}