]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ast_pretty/src/pprust/state/delimited.rs
Sync rust-lang/portable-simd@5f49d4c8435a25d804b2f375e949cb25479f5be9
[rust.git] / compiler / rustc_ast_pretty / src / pprust / state / delimited.rs
1 use std::iter::Peekable;
2 use std::mem;
3 use std::ops::Deref;
4
5 pub struct Delimited<I: Iterator> {
6     is_first: bool,
7     iter: Peekable<I>,
8 }
9
10 pub trait IterDelimited: Iterator + Sized {
11     fn delimited(self) -> Delimited<Self> {
12         Delimited { is_first: true, iter: self.peekable() }
13     }
14 }
15
16 impl<I: Iterator> IterDelimited for I {}
17
18 pub struct IteratorItem<T> {
19     value: T,
20     pub is_first: bool,
21     pub is_last: bool,
22 }
23
24 impl<I: Iterator> Iterator for Delimited<I> {
25     type Item = IteratorItem<I::Item>;
26
27     fn next(&mut self) -> Option<Self::Item> {
28         let value = self.iter.next()?;
29         let is_first = mem::replace(&mut self.is_first, false);
30         let is_last = self.iter.peek().is_none();
31         Some(IteratorItem { value, is_first, is_last })
32     }
33 }
34
35 impl<T> Deref for IteratorItem<T> {
36     type Target = T;
37
38     fn deref(&self) -> &Self::Target {
39         &self.value
40     }
41 }