moore_common/grind/
peek.rs1use 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}