moore_common/grind/
mod.rs1use 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
112impl<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
212pub 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}