swc_common/
iter.rs

1/// Copied from https://users.rust-lang.org/t/iterator-need-to-identify-the-last-element/8836/3
2pub trait IdentifyLast: Iterator + Sized {
3    fn identify_last(self) -> Iter<Self>;
4}
5
6impl<It> IdentifyLast for It
7where
8    It: Iterator,
9{
10    fn identify_last(mut self) -> Iter<Self> {
11        let e = self.next();
12        Iter {
13            iter: self,
14            buffer: e,
15        }
16    }
17}
18
19pub struct Iter<It>
20where
21    It: Iterator,
22{
23    iter: It,
24    buffer: Option<It::Item>,
25}
26
27impl<It> Iterator for Iter<It>
28where
29    It: Iterator,
30{
31    type Item = (bool, It::Item);
32
33    fn next(&mut self) -> Option<Self::Item> {
34        match self.buffer.take() {
35            None => None,
36            Some(e) => match self.iter.next() {
37                None => Some((true, e)),
38                Some(f) => {
39                    self.buffer = Some(f);
40                    Some((false, e))
41                }
42            },
43        }
44    }
45}