state_validation/
state_filter.rs

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}