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}