Open
Description
Add an iterator that allows mapping with (next_item, Option(&peek_item)
. This is useful for parsers. Exact semantics may vary, but the goal is to get something like tuple_windows
without needing to clone
100% credit to @talchas on Discord (I don't see that user here) for the implementation:
use std::iter::Peekable;
pub struct PeekMap<I: Iterator, F>(Peekable<I>, F);
pub fn peek_map<R, I: Iterator, F: FnMut(I::Item, Option<&I::Item>) -> R>(it: Peekable<I>, f: F) -> PeekMap<I, F> {
PeekMap(it, f)
}
impl<R, I: Iterator, F: FnMut(I::Item, Option<&I::Item>) -> R> Iterator for PeekMap<I, F> {
type Item = R;
fn next(&mut self) -> Option<R> {
let x = self.0.next()?;
Some((self.1)(x, self.0.peek()))
}
}
Metadata
Metadata
Assignees
Labels
No labels