Skip to content

Merge MultiPeek and PeekNth #933

Open
@Philippe-Cholet

Description

@Philippe-Cholet

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> { ... }

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions