use std::iter::Peekable; use std::mem; 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 value = self.iter.next()?; let is_first = mem::replace(&mut self.is_first, false); let is_last = self.iter.peek().is_none(); Some(IteratorItem { value, is_first, is_last }) } } impl Deref for IteratorItem { type Target = T; fn deref(&self) -> &Self::Target { &self.value } }