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