1use crate::{
2 iter::{IntoParserIter, ParserIter},
3 Parser,
4};
5use frunk_core::hlist::{HCons, HNil};
6use std::{io::Read, marker::PhantomData};
7
8pub struct Iter<F>(pub F);
9pub struct Simple<F>(pub F);
10
11pub trait ReaderRead {
12 type Out;
13 type Error;
14
15 fn read<R: Read>(self, reader: R) -> Result<Self::Out, Self::Error>;
16}
17
18pub struct Reader<P, S = (), F = HNil> {
19 parsers: P,
20 funcs: F,
21 state: S,
22}
23
24impl<P> Reader<P> {
25 #[inline]
26 pub fn new(parsers: P) -> Self {
27 Reader {
28 parsers: parsers,
29 funcs: HNil,
30 state: (),
31 }
32 }
33}
34
35impl<P, S> Reader<P, S> {
36 #[inline]
37 pub fn with_state<NS>(self, state: NS) -> Reader<P, NS> {
38 Reader {
39 parsers: self.parsers,
40 funcs: self.funcs,
41 state,
42 }
43 }
44}
45
46pub trait ReaderReadHelper {
47 type Out;
48 type Error;
49
50 fn exec<R: Read>(self, reader: R) -> Result<Self::Out, Self::Error>;
51}
52
53impl<S, P, F, Rest> ReaderReadHelper for (P, HCons<Simple<F>, Rest>, S)
54where
55 P: Parser,
56 (P::Next, Rest, S): ReaderReadHelper<Out = S, Error = P::Error>,
57 F: FnOnce(&mut S, P::Item) -> Result<(), P::Error>,
58{
59 type Out = S;
60 type Error = P::Error;
61
62 #[inline]
63 fn exec<R: Read>(self, mut reader: R) -> Result<S, Self::Error> {
64 let (
65 p,
66 HCons {
67 head: Simple(f),
68 tail,
69 },
70 mut state,
71 ) = self;
72 let (item, next) = p.next(&mut reader)?;
73 f(&mut state, item)?;
74 Ok((next, tail, state).exec(reader)?)
75 }
76}
77
78impl<S, P, F> ReaderReadHelper for (P, HCons<Simple<F>, HNil>, S)
79where
80 P: Parser<Next = ()>,
81 F: FnOnce(&mut S, P::Item) -> Result<(), P::Error>,
82{
83 type Out = S;
84 type Error = P::Error;
85
86 #[inline]
87 fn exec<R: Read>(self, mut reader: R) -> Result<S, Self::Error> {
88 let (
89 p,
90 HCons {
91 head: Simple(f),
92 tail: HNil,
93 },
94 mut state,
95 ) = self;
96 let (item, ()) = p.next(&mut reader)?;
97 f(&mut state, item)?;
98 Ok(state)
99 }
100}
101
102impl<S, I, P, F, Rest> ReaderReadHelper for (P, HCons<Iter<F>, Rest>, S)
103where
104 P: Parser<Item = Option<I>>,
105 I: Parser<Next = Option<I>>,
106 (P::Next, Rest, S): ReaderReadHelper<Out = S, Error = P::Error>,
107 F: FnOnce(&mut S, ParserIter<&mut dyn Read, Option<I>>) -> Result<(), P::Error>,
108{
109 type Out = S;
110 type Error = P::Error;
111
112 #[inline]
113 fn exec<R: Read>(self, mut reader: R) -> Result<S, Self::Error> {
114 let (
115 p,
116 HCons {
117 head: Iter(f),
118 tail,
119 },
120 mut state,
121 ) = self;
122 let (item, next) = p.next(&mut reader)?;
123 f(&mut state, item.parse_iter(&mut reader))?;
124 Ok((next, tail, state).exec(reader)?)
125 }
126}
127
128impl<PS, FS, S> ReaderRead for Reader<PS, S, FS>
129where
130 (PS, FS, S): ReaderReadHelper<Out = S>,
131{
132 type Out = S;
133 type Error = <(PS, FS, S) as ReaderReadHelper>::Error;
134
135 #[inline]
136 fn read<R: Read>(self, reader: R) -> Result<S, Self::Error> {
137 let Reader {
138 parsers,
139 funcs,
140 state,
141 } = self;
142
143 (parsers, funcs, state).exec(reader)
144 }
145}
146
147pub trait ReaderBuildHelper<S, F> {
148 type New;
149
150 fn then(self, func: F) -> Self::New;
151}
152
153impl<S, P, F, O> ReaderBuildHelper<S, Simple<F>> for (PhantomData<P>, HNil)
154where
155 P: Parser,
156 F: FnOnce(&mut S, P::Item) -> O,
157 O: Into<Result<(), P::Error>>,
158{
159 type New = HCons<Simple<F>, HNil>;
160
161 #[inline]
162 fn then(self, func: Simple<F>) -> Self::New {
163 HCons {
164 head: func,
165 tail: HNil,
166 }
167 }
168}
169
170impl<S, P, I, F, O> ReaderBuildHelper<S, Iter<F>> for (PhantomData<P>, HNil)
171where
172 P: Parser<Item = Option<I>>,
173 I: Parser<Next = Option<I>>,
174 F: FnOnce(&mut S, ParserIter<&mut dyn Read, Option<I>>) -> O,
175 O: Into<Result<(), P::Error>>,
176{
177 type New = HCons<Iter<F>, HNil>;
178
179 #[inline]
180 fn then(self, func: Iter<F>) -> Self::New {
181 HCons {
182 head: func,
183 tail: HNil,
184 }
185 }
186}
187
188impl<S, P, ExistingF, Rest, F> ReaderBuildHelper<S, F> for (PhantomData<P>, HCons<ExistingF, Rest>)
189where
190 P: Parser,
191 (PhantomData<P::Next>, Rest): ReaderBuildHelper<S, F>,
192{
193 type New = HCons<ExistingF, <(PhantomData<P::Next>, Rest) as ReaderBuildHelper<S, F>>::New>;
194
195 #[inline]
196 fn then(self, func: F) -> Self::New {
197 let (_, HCons { head, tail }) = self;
198 HCons {
199 head,
200 tail: (PhantomData, tail).then(func),
201 }
202 }
203}
204
205pub trait ReaderBuild<F> {
206 type New;
207
208 fn then(self, func: F) -> Self::New;
209}
210
211pub trait ReaderBuildIter<F> {
212 type New;
213
214 fn then_iter(self, func: F) -> Self::New;
215}
216
217impl<PS, FS, F, S> ReaderBuild<F> for Reader<PS, S, FS>
218where
219 (PhantomData<PS>, FS): ReaderBuildHelper<S, Simple<F>>,
220{
221 type New = Reader<PS, S, <(PhantomData<PS>, FS) as ReaderBuildHelper<S, Simple<F>>>::New>;
222
223 #[inline]
224 fn then(self, func: F) -> Self::New {
225 Reader {
226 parsers: self.parsers,
227 funcs: (PhantomData, self.funcs).then(Simple(func)),
228 state: self.state,
229 }
230 }
231}
232
233impl<PS, FS, F, S> ReaderBuildIter<F> for Reader<PS, S, FS>
234where
235 (PhantomData<PS>, FS): ReaderBuildHelper<S, Iter<F>>,
236{
237 type New = Reader<PS, S, <(PhantomData<PS>, FS) as ReaderBuildHelper<S, Iter<F>>>::New>;
238
239 #[inline]
240 fn then_iter(self, func: F) -> Self::New {
241 Reader {
242 parsers: self.parsers,
243 funcs: (PhantomData, self.funcs).then(Iter(func)),
244 state: self.state,
245 }
246 }
247}