moore_common/grind/
peek.rs

1// Copyright (c) 2016-2021 Fabian Schuiki
2
3use crate::grind::Grinder;
4use std;
5
6pub struct Peekable<T: Grinder> {
7    inner: T,
8    peek: T::Item,
9}
10
11impl<T> Peekable<T>
12where
13    T: Grinder,
14{
15    pub fn new(mut inner: T) -> Peekable<T> {
16        let peek = inner.next();
17        Peekable {
18            inner: inner,
19            peek: peek,
20        }
21    }
22
23    pub fn peek(&self) -> &T::Item {
24        &self.peek
25    }
26}
27
28impl<T> Grinder for Peekable<T>
29where
30    T: Grinder,
31{
32    type Item = T::Item;
33    type Error = T::Error;
34
35    fn emit(&mut self, err: Self::Error) {
36        self.inner.emit(err)
37    }
38
39    fn next(&mut self) -> Self::Item {
40        let mut n = self.inner.next();
41        std::mem::swap(&mut self.peek, &mut n);
42        n
43    }
44}
45
46impl<T> From<T> for Peekable<T>
47where
48    T: Grinder,
49{
50    fn from(inner: T) -> Peekable<T> {
51        Peekable::new(inner)
52    }
53}