1 use std::iter::Peekable;
2 use std::ops::Deref;
3 
4 pub struct Delimited<I: Iterator> {
5     is_first: bool,
6     iter: Peekable<I>,
7 }
8 
9 pub trait IterDelimited: Iterator + Sized {
delimited(self) -> Delimited<Self>10     fn delimited(self) -> Delimited<Self> {
11         Delimited {
12             is_first: true,
13             iter: self.peekable(),
14         }
15     }
16 }
17 
18 impl<I: Iterator> IterDelimited for I {}
19 
20 pub struct IteratorItem<T> {
21     value: T,
22     pub is_first: bool,
23     pub is_last: bool,
24 }
25 
26 impl<I: Iterator> Iterator for Delimited<I> {
27     type Item = IteratorItem<I::Item>;
28 
next(&mut self) -> Option<Self::Item>29     fn next(&mut self) -> Option<Self::Item> {
30         let item = IteratorItem {
31             value: self.iter.next()?,
32             is_first: self.is_first,
33             is_last: self.iter.peek().is_none(),
34         };
35         self.is_first = false;
36         Some(item)
37     }
38 }
39 
40 impl<T> Deref for IteratorItem<T> {
41     type Target = T;
42 
deref(&self) -> &Self::Target43     fn deref(&self) -> &Self::Target {
44         &self.value
45     }
46 }
47