moore_common/grind/
mod.rs

1// Copyright (c) 2016-2021 Fabian Schuiki
2
3//! This module provides an abstraction similar to iterators. Elements are
4//! produced in one direction, while errors bubble backwards until they are
5//! vented. This allows for complex transformation chains such as lexical
6//! analyzers and parsers to be constructed, where errors, warnings, or notices
7//! might be emitted without disturbing the transformation.
8
9use std;
10use std::marker::PhantomData;
11
12mod filter;
13mod lookahead;
14mod peek;
15pub mod utf8;
16
17pub use self::filter::Filter;
18pub use self::lookahead::Lookahead;
19pub use self::peek::Peekable;
20
21pub trait Chisel: Default {
22    type Value;
23    fn end() -> Self;
24    fn is_end(&self) -> bool;
25    fn value(self) -> Option<Self::Value>;
26    fn value_ref(&self) -> Option<&Self::Value>;
27}
28
29impl<T> Chisel for Option<T> {
30    type Value = T;
31    fn end() -> Option<T> {
32        None
33    }
34    fn is_end(&self) -> bool {
35        self.is_none()
36    }
37    fn value(self) -> Option<T> {
38        self
39    }
40    fn value_ref(&self) -> Option<&T> {
41        self.as_ref()
42    }
43}
44
45pub trait Grinder {
46    type Item: Chisel;
47    type Error;
48
49    fn next(&mut self) -> Self::Item;
50    fn emit(&mut self, err: Self::Error);
51
52    #[inline]
53    fn vent<F, E>(self, f: F) -> Vent<Self, F, E>
54    where
55        Self: Sized,
56        F: Fn(E),
57    {
58        Vent {
59            inner: self,
60            ventfn: f,
61            phantom: PhantomData,
62        }
63    }
64
65    #[inline]
66    fn unwrap(self) -> Unwrap<Self>
67    where
68        Self: Sized,
69    {
70        Unwrap { inner: self }
71    }
72
73    #[inline]
74    fn map_err<F, E>(self, f: F) -> MapErrGrinder<Self, F, E>
75    where
76        Self: Sized,
77        F: Fn(E) -> Self::Error,
78    {
79        MapErrGrinder {
80            inner: self,
81            mapfn: f,
82            phantom: PhantomData,
83        }
84    }
85
86    #[inline]
87    fn peekable(self) -> Peekable<Self>
88    where
89        Self: Sized,
90    {
91        Peekable::new(self)
92    }
93
94    #[inline]
95    fn lookaheadable(self) -> Lookahead<Self>
96    where
97        Self: Sized,
98    {
99        Lookahead::new(self)
100    }
101
102    #[inline]
103    fn filter<F>(self, f: F) -> Filter<Self, F>
104    where
105        Self: Sized,
106        F: Fn(&<Self::Item as Chisel>::Value) -> bool,
107    {
108        Filter::new(self, f)
109    }
110}
111
112// All Grinder implement UnventedGrinder.
113// impl<T: Grinder> UnventedGrinder for T {
114//     type Item = T::Item;
115//
116//     fn next(&mut self) -> Self::Item {
117//         self.next()
118//     }
119// }
120//
121// impl<I: Chisel, E: Debug> Iterator for Grinder<Item=I, Error=E> {
122//     type Item = <Self as Grinder>::Item;
123//     fn next(&mut self) -> Option<Self::Item> {
124//         self.next().value()
125//     }
126// }
127
128impl<I, C: Chisel<Value = I>, E> Iterator for dyn Grinder<Item = C, Error = E> {
129    type Item = I;
130
131    fn next(&mut self) -> Option<I> {
132        self.next().value()
133    }
134}
135
136pub struct Vent<T: Grinder, F, E> {
137    inner: T,
138    ventfn: F,
139    phantom: PhantomData<E>,
140}
141
142impl<T: Grinder, E, F> Grinder for Vent<T, F, E>
143where
144    F: Fn(E),
145{
146    type Item = T::Item;
147    type Error = E;
148
149    fn next(&mut self) -> Self::Item {
150        self.inner.next()
151    }
152
153    fn emit(&mut self, err: E) {
154        (self.ventfn)(err)
155    }
156}
157
158pub struct MapErrGrinder<T: Grinder, F, E> {
159    inner: T,
160    mapfn: F,
161    phantom: PhantomData<E>,
162}
163
164impl<T, E, F> Grinder for MapErrGrinder<T, F, E>
165where
166    T: Grinder,
167    F: Fn(E) -> T::Error,
168{
169    type Item = T::Item;
170    type Error = E;
171
172    fn next(&mut self) -> Self::Item {
173        self.inner.next()
174    }
175
176    fn emit(&mut self, err: E) {
177        let e = (self.mapfn)(err);
178        self.inner.emit(e);
179    }
180}
181
182pub struct Read<R: std::io::Read> {
183    inner: R,
184    buffer: Vec<u8>,
185    ptr: usize,
186    max: usize,
187}
188
189impl<R: std::io::Read> Grinder for Read<R> {
190    type Item = Option<std::io::Result<u8>>;
191    type Error = ();
192
193    fn next(&mut self) -> Self::Item {
194        if self.ptr >= self.max {
195            self.ptr = 0;
196            match self.inner.read(&mut self.buffer) {
197                Ok(sz) if sz > 0 => self.max = sz,
198                Ok(_) => return None,
199                Err(e) => return Some(Err(e)),
200            }
201        }
202        let v = Some(Ok(self.buffer[self.ptr]));
203        self.ptr += 1;
204        v
205    }
206
207    fn emit(&mut self, _: ()) {
208        unreachable!()
209    }
210}
211
212// pub fn from_read<T: std::io::Read>(read: T) -> Iter<std::io::Bytes<std::io::BufReader<T>>> {
213//     use std::io::Read;
214//     from_iter(std::io::BufReader::with_capacity(1024, read).bytes())
215// }
216
217pub fn from_read<T: std::io::Read>(read: T) -> Read<T> {
218    Read {
219        inner: read,
220        buffer: Vec::with_capacity(1024),
221        ptr: 0,
222        max: 0,
223    }
224}
225
226pub struct Iter<I: Iterator> {
227    inner: I,
228}
229
230impl<I: Iterator> Grinder for Iter<I> {
231    type Item = Option<I::Item>;
232    type Error = ();
233
234    fn next(&mut self) -> Option<I::Item> {
235        self.inner.next()
236    }
237
238    fn emit(&mut self, _: ()) {
239        unreachable!()
240    }
241}
242
243pub fn from_iter<I: Iterator>(iter: I) -> Iter<I> {
244    Iter { inner: iter }
245}
246
247pub struct Unwrap<T: Grinder> {
248    inner: T,
249}
250
251impl<I, E, C, T> Grinder for Unwrap<T>
252where
253    C: Chisel<Value = Result<I, E>>,
254    T: Grinder<Item = C, Error = E>,
255{
256    type Item = Option<I>;
257    type Error = T::Error;
258
259    fn emit(&mut self, err: E) {
260        self.inner.emit(err)
261    }
262
263    fn next(&mut self) -> Self::Item {
264        match self.inner.next().value() {
265            Some(Ok(v)) => Some(v),
266            Some(Err(e)) => {
267                self.emit(e);
268                None
269            }
270            None => None,
271        }
272    }
273}