foundry_common/iter.rs
1use std::iter::Peekable;
2
3pub struct Delimited<I: Iterator> {
4 is_first: bool,
5 iter: Peekable<I>,
6}
7
8pub trait IterDelimited: Iterator + Sized {
9 fn delimited(self) -> Delimited<Self> {
10 Delimited { is_first: true, iter: self.peekable() }
11 }
12}
13
14impl<I: Iterator> IterDelimited for I {}
15
16pub struct IteratorPosition {
17 pub is_first: bool,
18 pub is_last: bool,
19}
20
21impl<I: Iterator> Iterator for Delimited<I> {
22 type Item = (IteratorPosition, I::Item);
23
24 fn next(&mut self) -> Option<Self::Item> {
25 let item = self.iter.next()?;
26 let position =
27 IteratorPosition { is_first: self.is_first, is_last: self.iter.peek().is_none() };
28 self.is_first = false;
29 Some((position, item))
30 }
31}