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