use std::iter::Peekable; use std::ops::Deref; pub struct Delimited { is_first: bool, iter: Peekable, } pub trait IterDelimited: Iterator + Sized { fn delimited(self) -> Delimited { Delimited { is_first: true, iter: self.peekable(), } } } impl IterDelimited for I {} pub struct IteratorItem { value: T, pub is_first: bool, pub is_last: bool, } impl Iterator for Delimited { type Item = IteratorItem; fn next(&mut self) -> Option { let item = IteratorItem { value: self.iter.next()?, is_first: self.is_first, is_last: self.iter.peek().is_none(), }; self.is_first = false; Some(item) } } impl Deref for IteratorItem { type Target = T; fn deref(&self) -> &Self::Target { &self.value } }