1use crate::Condition;
2
3pub trait StateFilter<State, Input> {
4 type ValidOutput;
5 type Error: std::error::Error;
6 fn filter(state: &State, value: Input) -> Result<Self::ValidOutput, Self::Error>;
7}
8impl<State> StateFilter<State, ()> for () {
9 type ValidOutput = ();
10 type Error = std::convert::Infallible;
11 fn filter(_state: &State, (): ()) -> Result<Self::ValidOutput, Self::Error> {
12 Ok(())
13 }
14}
15impl<
16 State,
17 InitialInput: StateFilterInput,
18 Input0: StateFilterInput,
19 Input1: StateFilterInput,
20 F0: StateFilter<State, Input0>,
21 F1: StateFilter<State, Input1>,
22> StateFilter<State, InitialInput> for (Condition<Input0, F0>, Condition<Input1, F1>)
23where
24 InitialInput: StateFilterInputConversion<Input0>,
25 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
26 StateFilterInputCombination<F0::ValidOutput>,
27 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
28 F0::ValidOutput,
29 >>::Combined: StateFilterInputConversion<Input1>,
30 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
31 F0::ValidOutput,
32 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
33 StateFilterInputCombination<F1::ValidOutput>,
34{
35 type ValidOutput = <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
36 F0::ValidOutput,
37 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as
38 StateFilterInputCombination<F1::ValidOutput>>::Combined;
39 type Error = StateFilterTwoChainError<F0::Error, F1::Error>;
40 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
41 let (input, remainder) = value.split_take();
42 F0::filter(state, input)
43 .map(|v| remainder.combine(v))
44 .map_err(|e| StateFilterTwoChainError::Filter0(e))
45 .and_then(|v| {
46 let (input, remainder) = v.split_take();
47 F1::filter(state, input).map(|v| remainder.combine(v))
48 .map_err(|e| StateFilterTwoChainError::Filter1(e))
49 })
50 }
51}
52#[derive(thiserror::Error, Debug)]
53pub enum StateFilterTwoChainError<E0: std::error::Error, E1: std::error::Error> {
54 #[error(transparent)]
55 Filter0(E0),
56 #[error(transparent)]
57 Filter1(E1),
58}
59impl<
60 State,
61 InitialInput: StateFilterInput,
62 Input0: StateFilterInput,
63 Input1: StateFilterInput,
64 Input2: StateFilterInput,
65 F0: StateFilter<State, Input0>,
66 F1: StateFilter<State, Input1>,
67 F2: StateFilter<State, Input2>,
68> StateFilter<State, InitialInput>
69 for (
70 Condition<Input0, F0>,
71 Condition<Input1, F1>,
72 Condition<Input2, F2>,
73 )
74where
75 InitialInput: StateFilterInputConversion<Input0>,
76 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
77 StateFilterInputCombination<F0::ValidOutput>,
78 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
79 F0::ValidOutput,
80 >>::Combined: StateFilterInputConversion<Input1>,
81 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
82 F0::ValidOutput,
83 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
84 StateFilterInputCombination<F1::ValidOutput>,
85 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
86 F0::ValidOutput,
87 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
88 F1::ValidOutput,
89 >>::Combined: StateFilterInputConversion<Input2>,
90
91 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
92 F0::ValidOutput,
93 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
94 F1::ValidOutput,
95 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
96 StateFilterInputCombination<F2::ValidOutput>,
97{
98 type ValidOutput =
99 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
100 F0::ValidOutput,
101 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
102 F1::ValidOutput,
103 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
104 StateFilterInputCombination<F2::ValidOutput>>::Combined
105 ;
106 type Error = StateFilterThreeChainError<F0::Error, F1::Error, F2::Error>;
107 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
108 let (input, remainder) = value.split_take();
109 F0::filter(state, input)
110 .map(|v| remainder.combine(v))
111 .map_err(|e| StateFilterThreeChainError::Filter0(e))
112 .and_then(|v| {
113 let (input, remainder) = v.split_take();
114 F1::filter(state, input).map(|v| remainder.combine(v))
115 .map_err(|e| StateFilterThreeChainError::Filter1(e))
116 })
117 .and_then(|v| {
118 let (input, remainder) = v.split_take();
119 F2::filter(state, input).map(|v| remainder.combine(v))
120 .map_err(|e| StateFilterThreeChainError::Filter2(e))
121 })
122 }
123}
124#[derive(thiserror::Error, Debug)]
125pub enum StateFilterThreeChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error> {
126 #[error(transparent)]
127 Filter0(E0),
128 #[error(transparent)]
129 Filter1(E1),
130 #[error(transparent)]
131 Filter2(E2),
132}
133impl<
134 State,
135 InitialInput: StateFilterInput,
136 Input0: StateFilterInput,
137 Input1: StateFilterInput,
138 Input2: StateFilterInput,
139 Input3: StateFilterInput,
140 F0: StateFilter<State, Input0>,
141 F1: StateFilter<State, Input1>,
142 F2: StateFilter<State, Input2>,
143 F3: StateFilter<State, Input3>,
144> StateFilter<State, InitialInput>
145 for (
146 Condition<Input0, F0>,
147 Condition<Input1, F1>,
148 Condition<Input2, F2>,
149 Condition<Input3, F3>,
150 )
151where
152 InitialInput: StateFilterInputConversion<Input0>,
153 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
154 StateFilterInputCombination<F0::ValidOutput>,
155 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
156 F0::ValidOutput,
157 >>::Combined: StateFilterInputConversion<Input1>,
158 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
159 F0::ValidOutput,
160 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
161 StateFilterInputCombination<F1::ValidOutput>,
162 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
163 F0::ValidOutput,
164 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
165 F1::ValidOutput,
166 >>::Combined: StateFilterInputConversion<Input2>,
167
168 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
169 F0::ValidOutput,
170 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
171 F1::ValidOutput,
172 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
173 StateFilterInputCombination<F2::ValidOutput>,
174
175
176 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
177 F0::ValidOutput,
178 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
179 F1::ValidOutput,
180 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
181 StateFilterInputCombination<F2::ValidOutput>>::Combined: StateFilterInputConversion<Input3>,
182
183 <<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
184 F0::ValidOutput,
185 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
186 F1::ValidOutput,
187 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
188 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder: StateFilterInputCombination<F3::ValidOutput>,
189{
190 type ValidOutput =
191 <<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
192 F0::ValidOutput,
193 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
194 F1::ValidOutput,
195 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
196 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined
197 ;
198 type Error = StateFilterFourChainError<F0::Error, F1::Error, F2::Error, F3::Error>;
199 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
200 let (input, remainder) = value.split_take();
201 F0::filter(state, input)
202 .map(|v| remainder.combine(v))
203 .map_err(|e| StateFilterFourChainError::Filter0(e))
204 .and_then(|v| {
205 let (input, remainder) = v.split_take();
206 F1::filter(state, input).map(|v| remainder.combine(v))
207 .map_err(|e| StateFilterFourChainError::Filter1(e))
208 })
209 .and_then(|v| {
210 let (input, remainder) = v.split_take();
211 F2::filter(state, input).map(|v| remainder.combine(v))
212 .map_err(|e| StateFilterFourChainError::Filter2(e))
213 })
214 .and_then(|v| {
215 let (input, remainder) = v.split_take();
216 F3::filter(state, input).map(|v| remainder.combine(v))
217 .map_err(|e| StateFilterFourChainError::Filter3(e))
218 })
219 }
220}
221#[derive(thiserror::Error, Debug)]
222pub enum StateFilterFourChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error, E3: std::error::Error> {
223 #[error(transparent)]
224 Filter0(E0),
225 #[error(transparent)]
226 Filter1(E1),
227 #[error(transparent)]
228 Filter2(E2),
229 #[error(transparent)]
230 Filter3(E3),
231}
232impl<
233 State,
234 InitialInput: StateFilterInput,
235 Input0: StateFilterInput,
236 Input1: StateFilterInput,
237 Input2: StateFilterInput,
238 Input3: StateFilterInput,
239 Input4: StateFilterInput,
240 F0: StateFilter<State, Input0>,
241 F1: StateFilter<State, Input1>,
242 F2: StateFilter<State, Input2>,
243 F3: StateFilter<State, Input3>,
244 F4: StateFilter<State, Input4>,
245> StateFilter<State, InitialInput>
246 for (
247 Condition<Input0, F0>,
248 Condition<Input1, F1>,
249 Condition<Input2, F2>,
250 Condition<Input3, F3>,
251 Condition<Input4, F4>,
252 )
253where
254 InitialInput: StateFilterInputConversion<Input0>,
255 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
256 StateFilterInputCombination<F0::ValidOutput>,
257 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
258 F0::ValidOutput,
259 >>::Combined: StateFilterInputConversion<Input1>,
260 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
261 F0::ValidOutput,
262 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
263 StateFilterInputCombination<F1::ValidOutput>,
264 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
265 F0::ValidOutput,
266 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
267 F1::ValidOutput,
268 >>::Combined: StateFilterInputConversion<Input2>,
269
270 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
271 F0::ValidOutput,
272 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
273 F1::ValidOutput,
274 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
275 StateFilterInputCombination<F2::ValidOutput>,
276
277
278 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
279 F0::ValidOutput,
280 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
281 F1::ValidOutput,
282 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
283 StateFilterInputCombination<F2::ValidOutput>>::Combined: StateFilterInputConversion<Input3>,
284
285 <<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
286 F0::ValidOutput,
287 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
288 F1::ValidOutput,
289 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
290 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder: StateFilterInputCombination<F3::ValidOutput>,
291
292 <<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
293 F0::ValidOutput,
294 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
295 F1::ValidOutput,
296 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
297 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined: StateFilterInputConversion<Input4>,
298
299 <<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
300 F0::ValidOutput,
301 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
302 F1::ValidOutput,
303 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
304 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder: StateFilterInputCombination<F4::ValidOutput>,
305{
306 type ValidOutput =
307 <<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
308 F0::ValidOutput,
309 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
310 F1::ValidOutput,
311 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
312 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined
313 ;
314 type Error = StateFilterFiveChainError<F0::Error, F1::Error, F2::Error, F3::Error, F4::Error>;
315 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
316 let (input, remainder) = value.split_take();
317 F0::filter(state, input)
318 .map(|v| remainder.combine(v))
319 .map_err(|e| StateFilterFiveChainError::Filter0(e))
320 .and_then(|v| {
321 let (input, remainder) = v.split_take();
322 F1::filter(state, input).map(|v| remainder.combine(v))
323 .map_err(|e| StateFilterFiveChainError::Filter1(e))
324 })
325 .and_then(|v| {
326 let (input, remainder) = v.split_take();
327 F2::filter(state, input).map(|v| remainder.combine(v))
328 .map_err(|e| StateFilterFiveChainError::Filter2(e))
329 })
330 .and_then(|v| {
331 let (input, remainder) = v.split_take();
332 F3::filter(state, input).map(|v| remainder.combine(v))
333 .map_err(|e| StateFilterFiveChainError::Filter3(e))
334 })
335 .and_then(|v| {
336 let (input, remainder) = v.split_take();
337 F4::filter(state, input).map(|v| remainder.combine(v))
338 .map_err(|e| StateFilterFiveChainError::Filter4(e))
339 })
340 }
341}
342#[derive(thiserror::Error, Debug)]
343pub enum StateFilterFiveChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error, E3: std::error::Error, E4: std::error::Error> {
344 #[error(transparent)]
345 Filter0(E0),
346 #[error(transparent)]
347 Filter1(E1),
348 #[error(transparent)]
349 Filter2(E2),
350 #[error(transparent)]
351 Filter3(E3),
352 #[error(transparent)]
353 Filter4(E4),
354}
355impl<
356 State,
357 InitialInput: StateFilterInput,
358 Input0: StateFilterInput,
359 Input1: StateFilterInput,
360 Input2: StateFilterInput,
361 Input3: StateFilterInput,
362 Input4: StateFilterInput,
363 Input5: StateFilterInput,
364 F0: StateFilter<State, Input0>,
365 F1: StateFilter<State, Input1>,
366 F2: StateFilter<State, Input2>,
367 F3: StateFilter<State, Input3>,
368 F4: StateFilter<State, Input4>,
369 F5: StateFilter<State, Input5>,
370> StateFilter<State, InitialInput>
371 for (
372 Condition<Input0, F0>,
373 Condition<Input1, F1>,
374 Condition<Input2, F2>,
375 Condition<Input3, F3>,
376 Condition<Input4, F4>,
377 Condition<Input5, F5>,
378 )
379where
380 InitialInput: StateFilterInputConversion<Input0>,
381 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
382 StateFilterInputCombination<F0::ValidOutput>,
383 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
384 F0::ValidOutput,
385 >>::Combined: StateFilterInputConversion<Input1>,
386 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
387 F0::ValidOutput,
388 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
389 StateFilterInputCombination<F1::ValidOutput>,
390 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
391 F0::ValidOutput,
392 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
393 F1::ValidOutput,
394 >>::Combined: StateFilterInputConversion<Input2>,
395
396 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
397 F0::ValidOutput,
398 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
399 F1::ValidOutput,
400 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
401 StateFilterInputCombination<F2::ValidOutput>,
402
403
404 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
405 F0::ValidOutput,
406 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
407 F1::ValidOutput,
408 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
409 StateFilterInputCombination<F2::ValidOutput>>::Combined: StateFilterInputConversion<Input3>,
410
411 <<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
412 F0::ValidOutput,
413 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
414 F1::ValidOutput,
415 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
416 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder: StateFilterInputCombination<F3::ValidOutput>,
417
418 <<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
419 F0::ValidOutput,
420 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
421 F1::ValidOutput,
422 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
423 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined: StateFilterInputConversion<Input4>,
424
425 <<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
426 F0::ValidOutput,
427 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
428 F1::ValidOutput,
429 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
430 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder: StateFilterInputCombination<F4::ValidOutput>,
431
432 <<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
433 F0::ValidOutput,
434 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
435 F1::ValidOutput,
436 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
437 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined: StateFilterInputConversion<Input5>,
438
439 <<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
440 F0::ValidOutput,
441 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
442 F1::ValidOutput,
443 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
444 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder: StateFilterInputCombination<F5::ValidOutput>,
445{
446 type ValidOutput =
447 <<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
448 F0::ValidOutput,
449 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
450 F1::ValidOutput,
451 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
452 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined
453 ;
454 type Error = StateFilterSixChainError<F0::Error, F1::Error, F2::Error, F3::Error, F4::Error, F5::Error>;
455 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
456 let (input, remainder) = value.split_take();
457 F0::filter(state, input)
458 .map(|v| remainder.combine(v))
459 .map_err(|e| StateFilterSixChainError::Filter0(e))
460 .and_then(|v| {
461 let (input, remainder) = v.split_take();
462 F1::filter(state, input).map(|v| remainder.combine(v))
463 .map_err(|e| StateFilterSixChainError::Filter1(e))
464 })
465 .and_then(|v| {
466 let (input, remainder) = v.split_take();
467 F2::filter(state, input).map(|v| remainder.combine(v))
468 .map_err(|e| StateFilterSixChainError::Filter2(e))
469 })
470 .and_then(|v| {
471 let (input, remainder) = v.split_take();
472 F3::filter(state, input).map(|v| remainder.combine(v))
473 .map_err(|e| StateFilterSixChainError::Filter3(e))
474 })
475 .and_then(|v| {
476 let (input, remainder) = v.split_take();
477 F4::filter(state, input).map(|v| remainder.combine(v))
478 .map_err(|e| StateFilterSixChainError::Filter4(e))
479 })
480 .and_then(|v| {
481 let (input, remainder) = v.split_take();
482 F5::filter(state, input).map(|v| remainder.combine(v))
483 .map_err(|e| StateFilterSixChainError::Filter5(e))
484 })
485 }
486}
487#[derive(thiserror::Error, Debug)]
488pub enum StateFilterSixChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error, E3: std::error::Error, E4: std::error::Error, E5: std::error::Error> {
489 #[error(transparent)]
490 Filter0(E0),
491 #[error(transparent)]
492 Filter1(E1),
493 #[error(transparent)]
494 Filter2(E2),
495 #[error(transparent)]
496 Filter3(E3),
497 #[error(transparent)]
498 Filter4(E4),
499 #[error(transparent)]
500 Filter5(E5),
501}
502impl<
503 State,
504 InitialInput: StateFilterInput,
505 Input0: StateFilterInput,
506 Input1: StateFilterInput,
507 Input2: StateFilterInput,
508 Input3: StateFilterInput,
509 Input4: StateFilterInput,
510 Input5: StateFilterInput,
511 Input6: StateFilterInput,
512 F0: StateFilter<State, Input0>,
513 F1: StateFilter<State, Input1>,
514 F2: StateFilter<State, Input2>,
515 F3: StateFilter<State, Input3>,
516 F4: StateFilter<State, Input4>,
517 F5: StateFilter<State, Input5>,
518 F6: StateFilter<State, Input6>,
519> StateFilter<State, InitialInput>
520 for (
521 Condition<Input0, F0>,
522 Condition<Input1, F1>,
523 Condition<Input2, F2>,
524 Condition<Input3, F3>,
525 Condition<Input4, F4>,
526 Condition<Input5, F5>,
527 Condition<Input6, F6>,
528 )
529where
530 InitialInput: StateFilterInputConversion<Input0>,
531 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
532 StateFilterInputCombination<F0::ValidOutput>,
533 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
534 F0::ValidOutput,
535 >>::Combined: StateFilterInputConversion<Input1>,
536 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
537 F0::ValidOutput,
538 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
539 StateFilterInputCombination<F1::ValidOutput>,
540 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
541 F0::ValidOutput,
542 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
543 F1::ValidOutput,
544 >>::Combined: StateFilterInputConversion<Input2>,
545
546 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
547 F0::ValidOutput,
548 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
549 F1::ValidOutput,
550 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
551 StateFilterInputCombination<F2::ValidOutput>,
552
553
554 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
555 F0::ValidOutput,
556 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
557 F1::ValidOutput,
558 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
559 StateFilterInputCombination<F2::ValidOutput>>::Combined: StateFilterInputConversion<Input3>,
560
561 <<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
562 F0::ValidOutput,
563 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
564 F1::ValidOutput,
565 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
566 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder: StateFilterInputCombination<F3::ValidOutput>,
567
568 <<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
569 F0::ValidOutput,
570 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
571 F1::ValidOutput,
572 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
573 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined: StateFilterInputConversion<Input4>,
574
575 <<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
576 F0::ValidOutput,
577 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
578 F1::ValidOutput,
579 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
580 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder: StateFilterInputCombination<F4::ValidOutput>,
581
582 <<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
583 F0::ValidOutput,
584 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
585 F1::ValidOutput,
586 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
587 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined: StateFilterInputConversion<Input5>,
588
589 <<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
590 F0::ValidOutput,
591 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
592 F1::ValidOutput,
593 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
594 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder: StateFilterInputCombination<F5::ValidOutput>,
595
596 <<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
597 F0::ValidOutput,
598 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
599 F1::ValidOutput,
600 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
601 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined: StateFilterInputConversion<Input6>,
602
603 <<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
604 F0::ValidOutput,
605 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
606 F1::ValidOutput,
607 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
608 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder: StateFilterInputCombination<F6::ValidOutput>,
609{
610 type ValidOutput =
611 <<<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
612 F0::ValidOutput,
613 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
614 F1::ValidOutput,
615 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
616 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder as StateFilterInputCombination<F6::ValidOutput>>::Combined
617 ;
618 type Error = StateFilterSevenChainError<F0::Error, F1::Error, F2::Error, F3::Error, F4::Error, F5::Error, F6::Error>;
619 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
620 let (input, remainder) = value.split_take();
621 F0::filter(state, input)
622 .map(|v| remainder.combine(v))
623 .map_err(|e| StateFilterSevenChainError::Filter0(e))
624 .and_then(|v| {
625 let (input, remainder) = v.split_take();
626 F1::filter(state, input).map(|v| remainder.combine(v))
627 .map_err(|e| StateFilterSevenChainError::Filter1(e))
628 })
629 .and_then(|v| {
630 let (input, remainder) = v.split_take();
631 F2::filter(state, input).map(|v| remainder.combine(v))
632 .map_err(|e| StateFilterSevenChainError::Filter2(e))
633 })
634 .and_then(|v| {
635 let (input, remainder) = v.split_take();
636 F3::filter(state, input).map(|v| remainder.combine(v))
637 .map_err(|e| StateFilterSevenChainError::Filter3(e))
638 })
639 .and_then(|v| {
640 let (input, remainder) = v.split_take();
641 F4::filter(state, input).map(|v| remainder.combine(v))
642 .map_err(|e| StateFilterSevenChainError::Filter4(e))
643 })
644 .and_then(|v| {
645 let (input, remainder) = v.split_take();
646 F5::filter(state, input).map(|v| remainder.combine(v))
647 .map_err(|e| StateFilterSevenChainError::Filter5(e))
648 })
649 .and_then(|v| {
650 let (input, remainder) = v.split_take();
651 F6::filter(state, input).map(|v| remainder.combine(v))
652 .map_err(|e| StateFilterSevenChainError::Filter6(e))
653 })
654 }
655}
656#[derive(thiserror::Error, Debug)]
657pub enum StateFilterSevenChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error, E3: std::error::Error, E4: std::error::Error, E5: std::error::Error, E6: std::error::Error> {
658 #[error(transparent)]
659 Filter0(E0),
660 #[error(transparent)]
661 Filter1(E1),
662 #[error(transparent)]
663 Filter2(E2),
664 #[error(transparent)]
665 Filter3(E3),
666 #[error(transparent)]
667 Filter4(E4),
668 #[error(transparent)]
669 Filter5(E5),
670 #[error(transparent)]
671 Filter6(E6),
672}
673impl<
674 State,
675 InitialInput: StateFilterInput,
676 Input0: StateFilterInput,
677 Input1: StateFilterInput,
678 Input2: StateFilterInput,
679 Input3: StateFilterInput,
680 Input4: StateFilterInput,
681 Input5: StateFilterInput,
682 Input6: StateFilterInput,
683 Input7: StateFilterInput,
684 F0: StateFilter<State, Input0>,
685 F1: StateFilter<State, Input1>,
686 F2: StateFilter<State, Input2>,
687 F3: StateFilter<State, Input3>,
688 F4: StateFilter<State, Input4>,
689 F5: StateFilter<State, Input5>,
690 F6: StateFilter<State, Input6>,
691 F7: StateFilter<State, Input7>,
692> StateFilter<State, InitialInput>
693 for (
694 Condition<Input0, F0>,
695 Condition<Input1, F1>,
696 Condition<Input2, F2>,
697 Condition<Input3, F3>,
698 Condition<Input4, F4>,
699 Condition<Input5, F5>,
700 Condition<Input6, F6>,
701 Condition<Input7, F7>,
702 )
703where
704 InitialInput: StateFilterInputConversion<Input0>,
705 <InitialInput as StateFilterInputConversion<Input0>>::Remainder:
706 StateFilterInputCombination<F0::ValidOutput>,
707 <<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
708 F0::ValidOutput,
709 >>::Combined: StateFilterInputConversion<Input1>,
710 <<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
711 F0::ValidOutput,
712 >>::Combined as StateFilterInputConversion<Input1>>::Remainder:
713 StateFilterInputCombination<F1::ValidOutput>,
714 <<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
715 F0::ValidOutput,
716 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
717 F1::ValidOutput,
718 >>::Combined: StateFilterInputConversion<Input2>,
719
720 <<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
721 F0::ValidOutput,
722 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
723 F1::ValidOutput,
724 >>::Combined as StateFilterInputConversion<Input2>>::Remainder:
725 StateFilterInputCombination<F2::ValidOutput>,
726
727
728 <<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
729 F0::ValidOutput,
730 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
731 F1::ValidOutput,
732 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
733 StateFilterInputCombination<F2::ValidOutput>>::Combined: StateFilterInputConversion<Input3>,
734
735 <<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
736 F0::ValidOutput,
737 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
738 F1::ValidOutput,
739 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
740 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder: StateFilterInputCombination<F3::ValidOutput>,
741
742 <<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
743 F0::ValidOutput,
744 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
745 F1::ValidOutput,
746 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
747 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined: StateFilterInputConversion<Input4>,
748
749 <<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
750 F0::ValidOutput,
751 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
752 F1::ValidOutput,
753 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
754 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder: StateFilterInputCombination<F4::ValidOutput>,
755
756 <<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
757 F0::ValidOutput,
758 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
759 F1::ValidOutput,
760 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
761 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined: StateFilterInputConversion<Input5>,
762
763 <<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
764 F0::ValidOutput,
765 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
766 F1::ValidOutput,
767 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
768 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder: StateFilterInputCombination<F5::ValidOutput>,
769
770 <<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
771 F0::ValidOutput,
772 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
773 F1::ValidOutput,
774 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
775 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined: StateFilterInputConversion<Input6>,
776
777 <<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
778 F0::ValidOutput,
779 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
780 F1::ValidOutput,
781 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
782 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder: StateFilterInputCombination<F6::ValidOutput>,
783
784 <<<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
785 F0::ValidOutput,
786 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
787 F1::ValidOutput,
788 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
789 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder as StateFilterInputCombination<F6::ValidOutput>>::Combined: StateFilterInputConversion<Input7>,
790
791 <<<<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
792 F0::ValidOutput,
793 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
794 F1::ValidOutput,
795 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
796 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder as StateFilterInputCombination<F6::ValidOutput>>::Combined as StateFilterInputConversion<Input7>>::Remainder: StateFilterInputCombination<F7::ValidOutput>,
797{
798 type ValidOutput=
799 <<<<<<<<<<<<<<<<InitialInput as StateFilterInputConversion<Input0>>::Remainder as StateFilterInputCombination<
800 F0::ValidOutput,
801 >>::Combined as StateFilterInputConversion<Input1>>::Remainder as StateFilterInputCombination<
802 F1::ValidOutput,
803 >>::Combined as StateFilterInputConversion<Input2>>::Remainder as
804 StateFilterInputCombination<F2::ValidOutput>>::Combined as StateFilterInputConversion<Input3>>::Remainder as StateFilterInputCombination<F3::ValidOutput>>::Combined as StateFilterInputConversion<Input4>>::Remainder as StateFilterInputCombination<F4::ValidOutput>>::Combined as StateFilterInputConversion<Input5>>::Remainder as StateFilterInputCombination<F5::ValidOutput>>::Combined as StateFilterInputConversion<Input6>>::Remainder as StateFilterInputCombination<F6::ValidOutput>>::Combined as StateFilterInputConversion<Input7>>::Remainder as StateFilterInputCombination<F7::ValidOutput>>::Combined
805 ;
806 type Error = StateFilterEightChainError<F0::Error, F1::Error, F2::Error, F3::Error, F4::Error, F5::Error, F6::Error, F7::Error>;
807 fn filter(state: &State, value: InitialInput) -> Result<Self::ValidOutput, Self::Error> {
808 let (input, remainder) = value.split_take();
809 F0::filter(state, input)
810 .map(|v| remainder.combine(v))
811 .map_err(|e| StateFilterEightChainError::Filter0(e))
812 .and_then(|v| {
813 let (input, remainder) = v.split_take();
814 F1::filter(state, input).map(|v| remainder.combine(v))
815 .map_err(|e| StateFilterEightChainError::Filter1(e))
816 })
817 .and_then(|v| {
818 let (input, remainder) = v.split_take();
819 F2::filter(state, input).map(|v| remainder.combine(v))
820 .map_err(|e| StateFilterEightChainError::Filter2(e))
821 })
822 .and_then(|v| {
823 let (input, remainder) = v.split_take();
824 F3::filter(state, input).map(|v| remainder.combine(v))
825 .map_err(|e| StateFilterEightChainError::Filter3(e))
826 })
827 .and_then(|v| {
828 let (input, remainder) = v.split_take();
829 F4::filter(state, input).map(|v| remainder.combine(v))
830 .map_err(|e| StateFilterEightChainError::Filter4(e))
831 })
832 .and_then(|v| {
833 let (input, remainder) = v.split_take();
834 F5::filter(state, input).map(|v| remainder.combine(v))
835 .map_err(|e| StateFilterEightChainError::Filter5(e))
836 })
837 .and_then(|v| {
838 let (input, remainder) = v.split_take();
839 F6::filter(state, input).map(|v| remainder.combine(v))
840 .map_err(|e| StateFilterEightChainError::Filter6(e))
841 })
842 .and_then(|v| {
843 let (input, remainder) = v.split_take();
844 F7::filter(state, input).map(|v| remainder.combine(v))
845 .map_err(|e| StateFilterEightChainError::Filter7(e))
846 })
847 }
848}
849#[derive(thiserror::Error, Debug)]
850pub enum StateFilterEightChainError<E0: std::error::Error, E1: std::error::Error, E2: std::error::Error, E3: std::error::Error, E4: std::error::Error, E5: std::error::Error, E6: std::error::Error, E7: std::error::Error> {
851 #[error(transparent)]
852 Filter0(E0),
853 #[error(transparent)]
854 Filter1(E1),
855 #[error(transparent)]
856 Filter2(E2),
857 #[error(transparent)]
858 Filter3(E3),
859 #[error(transparent)]
860 Filter4(E4),
861 #[error(transparent)]
862 Filter5(E5),
863 #[error(transparent)]
864 Filter6(E6),
865 #[error(transparent)]
866 Filter7(E7),
867}
868
869pub trait StateFilterInput {}
870macro_rules! impl_state_filter_input_for_tuple {
871 ($($t: ident),*) => {
872 impl<$($t: StateFilterInput),*> StateFilterInput for ($($t,)*) {}
873 };
874}
875variadics_please::all_tuples!(impl_state_filter_input_for_tuple, 1, 16, T);
876
877pub trait StateFilterInputConversion<T> {
878 type Remainder;
879 fn split_take(self) -> (T, Self::Remainder);
880}
881
882pub trait StateFilterInputCombination<T> {
883 type Combined;
884 fn combine(self, value: T) -> Self::Combined;
885}
886
887impl<T: StateFilterInput> StateFilterInputCombination<T> for () {
888 type Combined = T;
889 fn combine(self, value: T) -> Self::Combined {
890 value
891 }
892}
893impl<T: StateFilterInput, U: StateFilterInput> StateFilterInputCombination<(T,)> for (U,) {
894 type Combined = (U, T);
895 fn combine(self, value: (T,)) -> Self::Combined {
896 (self.0, value.0)
897 }
898}
899impl<T: StateFilterInput, U: StateFilterInput> StateFilterInputCombination<(T,)> for (U, ()) {
900 type Combined = (U, T);
901 fn combine(self, value: (T,)) -> Self::Combined {
902 (self.0, value.0)
903 }
904}
905impl<T: StateFilterInput, U0: StateFilterInput, U1: StateFilterInput> StateFilterInputCombination<(T,)>
906 for (U0, U1)
907{
908 type Combined = (U0, U1, T);
909 fn combine(self, value: (T,)) -> Self::Combined {
910 (self.0, self.1, value.0)
911 }
912}
913impl<U0: StateFilterInput, U1: StateFilterInput> StateFilterInputCombination<()> for (U0, U1) {
914 type Combined = (U0, U1);
915 fn combine(self, (): ()) -> Self::Combined {
916 (self.0, self.1)
917 }
918}