tan/util/
put_back_iterator.rs

1// #insight used in parser.
2
3pub struct PutBackIterator<'a, T> {
4    items: std::slice::Iter<'a, T>,
5    buffer: Vec<&'a T>,
6}
7
8impl<'a, T> Iterator for PutBackIterator<'a, T> {
9    type Item = &'a T;
10
11    fn next(&mut self) -> Option<Self::Item> {
12        // First try to exhaust the items that where 'peeked' and the 'put back'
13        // to the buffer.
14        if let Some(item) = self.buffer.pop() {
15            return Some(item);
16        }
17
18        if let Some(item) = self.items.next() {
19            Some(item)
20        } else {
21            None
22        }
23    }
24
25    // #todo add has_next or something.
26}
27
28// #todo explain what this does.
29impl<'a, T> PutBackIterator<'a, T> {
30    pub fn new(items: &'a [T]) -> Self {
31        Self {
32            items: items.iter(),
33            buffer: Vec::new(),
34        }
35    }
36
37    // #todo find a better name.
38    pub fn put_back(&mut self, item: &'a T) {
39        self.buffer.push(item);
40    }
41}
42
43// #todo add unit tests.