Those two adaptors are quite similar, except one handles an additional index.
While specializing nth/last/count for them, I nearly wrote the same code.
Before going further, I think they should be aliases of a more general struct.
Merge those would reduce duplication and additionally provide more methods for MultiPeek for "free".
I note that most of methods' documentation would be merged. We would need to be "careful" on this.
Draft
#[derive(Debug, Clone)]
/*kept private*/ struct MultiPeekGeneral<I: Iterator, Idx> {
iter: Fuse<I>,
buf: VecDeque<I::Item>,
index: Idx,
}
pub type MultiPeek<I> = MultiPeekGeneral<I, usize>;
pub type PeekNth<I> = MultiPeekGeneral<I, ()>;
/*kept private*/ trait PeekIndex { ... } // fn reset_index probably. Maybe more.
impl PeekIndex for () { ... }
impl PeekIndex for usize { ... }
impl<I: Iterator, Idx: PeekIndex> MultiPeekGeneral<I, Idx> {
// public functions: peek peek_mut peek_nth peek_nth_mut next_if next_if_eq nth_if nth_if_eq
}
impl<I: Iterator> MultiPeek<I> { // not for PeekNth
// public functions: reset_peek
}
impl<I: Iterator, Idx> Iterator for MultiPeekGeneral<I, Idx> { ... }
impl<I: ExactSizeIterator, Idx> ExactSizeIterator for MultiPeekGeneral<I, Idx> {}
impl<I: Iterator, Idx> PeekingNext for MultiPeekGeneral<I, Idx> { ... }
Those two adaptors are quite similar, except one handles an additional index. While specializing
nth/last/count
for them, I nearly wrote the same code. Before going further, I think they should be aliases of a more general struct.Merge those would reduce duplication and additionally provide more methods for
MultiPeek
for "free".I note that most of methods' documentation would be merged. We would need to be "careful" on this.
Draft