fed/
lib.rs

1//! Anonymous, type-based, tagged type unions (here termed 'type federations') in stable Rust
2//!
3//! # Setup
4//! In your crate root, include the crate aliased to `_fed` (since you'll rely on the `init_fed!`
5//! macro to declare the `fed` module):
6//!
7//! ```
8//! #[macro_use]
9//! extern crate fed as _fed;
10//! # fn main() {
11//! # }
12//! ```
13//!
14//! Then, define all of the `fed` traits in your crate with this macro call:
15//!
16//! ```
17//! # #[macro_use]
18//! # extern crate fed as _fed;
19//! init_fed!();
20//! # fn main() {
21//! # }
22//! ```
23//!
24//! To actually use a type federation, you'll need to implement the type federation traits for all
25//! the concrete types you want to comprise the federation, via the `fed!` macro:
26//!
27//! ```
28//! # #[macro_use]
29//! # extern crate fed as _fed;
30//! # init_fed!();
31//! use fed::*;
32//!
33//! fed!(String, bool, u8, Vec<i32>);
34//!
35//! fn main() {
36//!     let var: Fed4<String, bool, u8, Vec<i32>> = 33.into();
37//!     assert!(var.is::<u8>());
38//! }
39//! ```
40//!
41//! For the time being, notice that we unfortunately will need to `use` everything in the `fed`
42//! module anywhere we want to use type federations. If this crate sees any use where this is an
43//! issue, I might work on fixing that. But this is largely intended for prototyping the feature to
44//! determine whether a fully fledged, built-in version would be useful for Rust to have.
45//!
46//! ## Recursive types
47//!
48//! Types like these could—for example—be useful for replacing much of the boilerplate used to
49//! express serialization formats like JSON and TOML.
50//!
51//! ```
52//! # #[macro_use]
53//! # extern crate fed as _fed;
54//! # init_fed!();
55//! # use fed::*;
56//! // Wrapping ValueT in a newtype struct breaks the cyclic reference so that
57//! // we can make a recursive type.
58//! pub struct Value(pub ValueT);
59//! type ValueT = Fed3<i32, String, Array>;
60//! type Array = Vec<Value>;
61//! fed!(
62//!     i32,
63//!     String,
64//!     Array,
65//! );
66//! // (Would also want to implement utility traits like `Deref<Target=ValueT> for Value` and
67//! // `From<ValueT> for Value`.)
68//!
69//! # use ::std::ops::Deref;
70//! # impl Deref for Value {
71//! #     type Target = ValueT;
72//! #
73//! #     fn deref(&self) -> &Self::Target {
74//! #         &self.0
75//! #     }
76//! # }
77//! #
78//! # impl From<ValueT> for Value {
79//! #     fn from(value: ValueT) -> Self {
80//! #         Value(value)
81//! #     }
82//! # }
83//! #
84//! # fn main() {
85//! let value = Value(123.into());
86//! assert!((*value).is::<i32>());
87//! # }
88//! ```
89//!
90//! Tidying instantiation up with a simple macro enables the following.
91//!
92//! ```
93//! # #[macro_use]
94//! # extern crate fed as _fed;
95//! # init_fed!();
96//! # use fed::*;
97//! # pub struct Value(pub ValueT);
98//! # type ValueT = Fed3<i32, String, Array>;
99//! # type Array = Vec<Value>;
100//! # fed!(
101//! #     i32,
102//! #     String,
103//! #     Array,
104//! # );
105//! # use ::std::ops::Deref;
106//! # impl Deref for Value {
107//! #     type Target = ValueT;
108//! #
109//! #     fn deref(&self) -> &Self::Target {
110//! #         &self.0
111//! #     }
112//! # }
113//! #
114//! # impl From<ValueT> for Value {
115//! #     fn from(value: ValueT) -> Self {
116//! #         Value(value)
117//! #     }
118//! # }
119//! #
120//! # macro_rules! array {
121//! #     ($($item:expr,)*) => {
122//! #         vec![$(Value($item.into()),)*]
123//! #     };
124//! #     ($($item:expr),*) => { array![$($item,)*] };
125//! # }
126//! #
127//! # fn main() {
128//! let ary = array![
129//!     32,
130//!     String::from("abc"),
131//!     array![
132//!         String::from("nesting!"),
133//!         array![],
134//!         8,
135//!     ],
136//!     74,
137//! ];
138//!
139//! assert!(ary[0].deref().is::<i32>());
140//! assert_eq!(ary[1].as_ref().extract::<&String>().ok().unwrap(), "abc");
141//! assert_eq!(ary[2].as_ref().extract::<&Array>().unwrap().len(), 3);
142//! assert!(
143//!     ary[2]
144//!     .as_ref()
145//!     .extract::<&Array>()
146//!     .unwrap()
147//!     [0]
148//!     .deref()
149//!     .is::<String>()
150//! );
151//! # }
152//! ```
153
154// // Doesn't work...complains about duplicate implementations.
155// // Have to implement non-generically (with concrete types)
156//
157// impl<A, B> ::std::convert::From<Fed1<A>> for Fed2<A, B> {
158//     fn from(val: Fed1<A>) -> Self {
159//         match val {
160//             Fed1::T1(val) => Fed2::T1(val),
161//         }
162//     }
163// }
164//
165// impl<A, B> ::std::convert::From<Fed1<B>> for Fed2<A, B> {
166//     fn from(val: Fed1<B>) -> Self {
167//         match val {
168//             Fed1::T1(val) => Fed2::T2(val),
169//         }
170//     }
171// }
172//
173// // A notion of what a built in type federation concept might look like
174// // (instead of the order-dependent `FedX`).
175// impl<A | B> ::std::convert::From<(A|)> for (A|B) {
176//     fn from(val: (A|)) -> Self {
177//         let Ok(val) = val.extract::<A>();
178//         val.into()
179//     }
180// }
181
182#[macro_export]
183macro_rules! basic_fed {
184    ($typename:ident, @deriving:[$($derive_trait:ident),*], $(($letter:ident, $f_letter:ident) => [$enum_var:ident; $arg_name:ident]),*,) => {
185        #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, $($derive_trait),*)]
186        pub enum $typename< $($letter),* > {
187            $(
188            $enum_var($letter)
189            ),*
190        }
191
192        impl< $($letter),* > $typename< $($letter),* > {
193            pub fn map_all<T, $($f_letter),*>(self, $( $arg_name : $f_letter ),* ) -> T
194            where $(
195                $f_letter: FnOnce($letter) -> T
196            ),*
197            {
198                match self { $(
199                    $typename::$enum_var(val) => $arg_name(val)
200                ),* }
201            }
202
203            pub fn as_ref(&self) -> $typename< $(&$letter),* > {
204                match self {
205                    $(
206                    &$typename::$enum_var(ref val) => $typename::$enum_var(val)
207                    ),*
208                }
209            }
210
211            pub fn as_mut(&mut self) -> $typename< $(&mut $letter),* > {
212                match self {
213                    $(
214                    &mut $typename::$enum_var(ref mut val) => $typename::$enum_var(val)
215                    ),*
216                }
217            }
218        }
219    };
220}
221
222/// Setup macro to be called after including the fed crate
223///
224/// Unfortunately necessary since the type federation properties cannot be implemented generically,
225/// and since the client crate needs to own them in order to be able to implement them for external
226/// types.
227#[macro_export]
228macro_rules! init_fed {
229    () => { init_fed!(@deriving:[]); };
230    (@deriving:[$($derive_trait:ident),*]) => {
231        #[allow(dead_code)]
232        pub mod fed {
233            pub trait Fed: Sized {
234                fn is<T>(&self) -> bool
235                where Self: Is_<T> {
236                    Is_::<T>::is_(self)
237                }
238
239                fn extract<T>(self) -> ::std::result::Result<T, <Self as Extract_<T>>::Lower>
240                where Self: Extract_<T> {
241                    Extract_::<T>::extract_(self)
242                }
243
244                fn map_same<T, F>(self, action: F) -> Self
245                where F: Fn(T) -> T,
246                      Self: MapSame_<T>
247                {
248                    MapSame_::<T>::map_same_(self, action)
249                }
250            }
251
252            impl<T: Sized> Fed for T {}
253
254            pub trait Is_<T>: Sized {
255                fn is_(&self) -> bool;
256            }
257
258            pub trait Extract_<T>: Sized {
259                type Lower: Sized;
260                fn extract_(self) -> ::std::result::Result<T, Self::Lower>;
261            }
262
263            pub trait MapSame_<T>: Sized {
264                fn map_same_<F>(self, action: F) -> Self where F: Fn(T) -> T;
265            }
266
267            /// A 'never' type
268            #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, $($derive_trait),*)]
269            pub enum Fed0 {}
270
271            #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, $($derive_trait),*)]
272            pub enum Fed1<A> {
273                T1(A),
274            }
275
276            impl<A: ::std::default::Default> ::std::default::Default for Fed1<A> {
277                fn default() -> Self {
278                    A::default().into()
279                }
280            }
281
282            impl<A> ::std::convert::From<A> for Fed1<A> {
283                fn from(t1: A) -> Self {
284                    Fed1::T1(t1)
285                }
286            }
287
288            impl<A> Fed1<A> {
289                pub fn map_all<T, F>(self, f_1: F) -> T where F: FnOnce(A) -> T {
290                    match self {
291                        Fed1::T1(t1) => f_1(t1),
292                    }
293                }
294
295                pub fn as_ref(&self) -> Fed1<&A> {
296                    match self {
297                        &Fed1::T1(ref t1) => Fed1::T1(t1),
298                    }
299                }
300
301                pub fn as_mut(&mut self) -> Fed1<&mut A> {
302                    match self {
303                        &mut Fed1::T1(ref mut t1) => Fed1::T1(t1),
304                    }
305                }
306
307                pub fn into_tuple(self) -> (Option<A>,) {
308                    match self {
309                        Fed1::T1(t1) => (Some(t1),),
310                    }
311                }
312            }
313
314            impl<A: Sized> Is_<A> for Fed1<A> {
315                fn is_(&self) -> bool { true }
316            }
317
318            impl<'a, A: Sized> Is_<A> for &'a Fed1<A> {
319                fn is_(&self) -> bool { true }
320            }
321
322            impl<A: Sized> Extract_<A> for Fed1<A> {
323                type Lower = Fed0;
324                fn extract_(self) -> ::std::result::Result<A, Self::Lower> {
325                    match self { Fed1::T1(val) => ::std::result::Result::Ok(val) }
326                }
327            }
328
329            impl<A: Sized> MapSame_<A> for Fed1<A> {
330                fn map_same_<F>(self, action: F) -> Self where F: Fn(A) -> A {
331                    match self { Fed1::T1(val) => action(val).into() }
332                }
333            }
334
335            basic_fed!{
336                Fed2,
337                @deriving:[$($derive_trait),*],
338                (A, FA) => [T1; f_1],
339                (B, FB) => [T2; f_2],
340            }
341
342            basic_fed!{
343                Fed3,
344                @deriving:[$($derive_trait),*],
345                (A, FA) => [T1; f_1],
346                (B, FB) => [T2; f_2],
347                (C, FC) => [T3; f_3],
348            }
349
350            basic_fed!{
351                Fed4,
352                @deriving:[$($derive_trait),*],
353                (A, FA) => [T1; f_1],
354                (B, FB) => [T2; f_2],
355                (C, FC) => [T3; f_3],
356                (D, FD) => [T4; f_4],
357            }
358
359            basic_fed!{
360                Fed5,
361                @deriving:[$($derive_trait),*],
362                (A, FA) => [T1; f_1],
363                (B, FB) => [T2; f_2],
364                (C, FC) => [T3; f_3],
365                (D, FD) => [T4; f_4],
366                (E, FE) => [T5; f_5],
367            }
368
369            basic_fed!{
370                Fed6,
371                @deriving:[$($derive_trait),*],
372                (A, FA) => [T1; f_1],
373                (B, FB) => [T2; f_2],
374                (C, FC) => [T3; f_3],
375                (D, FD) => [T4; f_4],
376                (E, FE) => [T5; f_5],
377                (F, FF) => [T6; f_6],
378            }
379
380            basic_fed!{
381                Fed7,
382                @deriving:[$($derive_trait),*],
383                (A, FA) => [T1; f_1],
384                (B, FB) => [T2; f_2],
385                (C, FC) => [T3; f_3],
386                (D, FD) => [T4; f_4],
387                (E, FE) => [T5; f_5],
388                (F, FF) => [T6; f_6],
389                (G, FG) => [T7; f_7],
390            }
391
392            basic_fed!{
393                Fed8,
394                @deriving:[$($derive_trait),*],
395                (A, FA) => [T1; f_1],
396                (B, FB) => [T2; f_2],
397                (C, FC) => [T3; f_3],
398                (D, FD) => [T4; f_4],
399                (E, FE) => [T5; f_5],
400                (F, FF) => [T6; f_6],
401                (G, FG) => [T7; f_7],
402                (H, FH) => [T8; f_8],
403            }
404
405            // Don't know how to turn the following `into_tuple` implementations into
406            // macros
407
408            impl<A, B> Fed2<A, B> {
409                // Hack to facilitate matching in absence of dedicated `match` syntax for
410                // type federations
411                pub fn into_tuple(self) -> (Option<A>, Option<B>) {
412                    match self {
413                        Fed2::T1(val) => (Some(val), None),
414                        Fed2::T2(val) => (None, Some(val)),
415                    }
416                }
417            }
418
419            impl<A, B, C> Fed3<A, B, C> {
420                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>) {
421                    match self {
422                        Fed3::T1(val) => (Some(val), None, None),
423                        Fed3::T2(val) => (None, Some(val), None),
424                        Fed3::T3(val) => (None, None, Some(val)),
425                    }
426                }
427            }
428
429            impl<A, B, C, D> Fed4<A, B, C, D> {
430                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>, Option<D>) {
431                    match self {
432                        Fed4::T1(val) => (Some(val), None, None, None),
433                        Fed4::T2(val) => (None, Some(val), None, None),
434                        Fed4::T3(val) => (None, None, Some(val), None),
435                        Fed4::T4(val) => (None, None, None, Some(val)),
436                    }
437                }
438            }
439
440            impl<A, B, C, D, E> Fed5<A, B, C, D, E> {
441                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>, Option<D>, Option<E>) {
442                    match self {
443                        Fed5::T1(val) => (Some(val), None, None, None, None),
444                        Fed5::T2(val) => (None, Some(val), None, None, None),
445                        Fed5::T3(val) => (None, None, Some(val), None, None),
446                        Fed5::T4(val) => (None, None, None, Some(val), None),
447                        Fed5::T5(val) => (None, None, None, None, Some(val)),
448                    }
449                }
450            }
451
452            impl<A, B, C, D, E, F> Fed6<A, B, C, D, E, F> {
453                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>, Option<D>, Option<E>, Option<F>) {
454                    match self {
455                        Fed6::T1(val) => (Some(val), None, None, None, None, None),
456                        Fed6::T2(val) => (None, Some(val), None, None, None, None),
457                        Fed6::T3(val) => (None, None, Some(val), None, None, None),
458                        Fed6::T4(val) => (None, None, None, Some(val), None, None),
459                        Fed6::T5(val) => (None, None, None, None, Some(val), None),
460                        Fed6::T6(val) => (None, None, None, None, None, Some(val)),
461                    }
462                }
463            }
464
465            impl<A, B, C, D, E, F, G> Fed7<A, B, C, D, E, F, G> {
466                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>, Option<D>, Option<E>, Option<F>, Option<G>) {
467                    match self {
468                        Fed7::T1(val) => (Some(val), None, None, None, None, None, None),
469                        Fed7::T2(val) => (None, Some(val), None, None, None, None, None),
470                        Fed7::T3(val) => (None, None, Some(val), None, None, None, None),
471                        Fed7::T4(val) => (None, None, None, Some(val), None, None, None),
472                        Fed7::T5(val) => (None, None, None, None, Some(val), None, None),
473                        Fed7::T6(val) => (None, None, None, None, None, Some(val), None),
474                        Fed7::T7(val) => (None, None, None, None, None, None, Some(val)),
475                    }
476                }
477            }
478
479            impl<A, B, C, D, E, F, G, H> Fed8<A, B, C, D, E, F, G, H> {
480                pub fn into_tuple(self) -> (Option<A>, Option<B>, Option<C>, Option<D>, Option<E>, Option<F>, Option<G>, Option<H>) {
481                    match self {
482                        Fed8::T1(val) => (Some(val), None, None, None, None, None, None, None),
483                        Fed8::T2(val) => (None, Some(val), None, None, None, None, None, None),
484                        Fed8::T3(val) => (None, None, Some(val), None, None, None, None, None),
485                        Fed8::T4(val) => (None, None, None, Some(val), None, None, None, None),
486                        Fed8::T5(val) => (None, None, None, None, Some(val), None, None, None),
487                        Fed8::T6(val) => (None, None, None, None, None, Some(val), None, None),
488                        Fed8::T7(val) => (None, None, None, None, None, None, Some(val), None),
489                        Fed8::T8(val) => (None, None, None, None, None, None, None, Some(val)),
490                    }
491                }
492            }
493        }
494    };
495    (@deriving:[$($derive_trait:ident,)*]) => { init_fed!(@deriving:[$($derive_trait),*]); };
496}
497
498#[macro_export]
499macro_rules! from_fed {
500    ($newtype:ty; $generic:ident; $($component:ty),*; $a:ty, $enum_var:path) => {
501        impl ::std::convert::From<$a> for $newtype {
502            fn from(val: $a) -> Self {
503                $enum_var(val)
504            }
505        }
506
507        impl<'a> ::std::convert::From<&'a $a> for $generic< $(&'a $component),* > {
508            fn from(val: &'a $a) -> Self {
509                $enum_var(val)
510            }
511        }
512    };
513}
514
515#[macro_export]
516macro_rules! fed_traits {
517    ($newtype:ty; $generic:ident; $($component:ty),*; $a:ty, $enum_var:path, $lower_type:ident, $($b:ty => $b_enum_var:path),*) => {
518        impl Is_<$a> for $newtype {
519            fn is_(&self) -> bool {
520                match *self {
521                    $enum_var(_) => true,
522                    _ => false,
523                }
524            }
525        }
526
527        impl<'a> Is_<$a> for &'a $newtype {
528            fn is_(&self) -> bool {
529                match *self {
530                    &$enum_var(_) => true,
531                    _ => false,
532                }
533            }
534        }
535
536        impl<'a> Is_<&'a $a> for $generic< $(&'a $component),* > {
537            fn is_(&self) -> bool {
538                match self {
539                    &$enum_var(_) => true,
540                    _ => false,
541                }
542            }
543        }
544
545        impl Extract_<$a> for $newtype {
546            type Lower = $lower_type< $($b),* >;
547
548            fn extract_(self) -> ::std::result::Result<$a, Self::Lower> {
549                match self {
550                    $enum_var(val) => ::std::result::Result::Ok(val),
551
552                    $(
553                        $b_enum_var(val) => ::std::result::Result::Err(val.into())
554                    ),*
555                }
556            }
557        }
558
559        impl<'a> Extract_<&'a $a> for $generic< $(&'a $component),* > {
560            type Lower = $lower_type< $(&'a $b),* >;
561
562            fn extract_(self) -> ::std::result::Result<&'a $a, Self::Lower> {
563                match self {
564                    $enum_var(val) => ::std::result::Result::Ok(val),
565
566                    $(
567                        $b_enum_var(val) => ::std::result::Result::Err(val.into())
568                    ),*
569                }
570            }
571        }
572
573        impl MapSame_<$a> for $newtype {
574            fn map_same_<F>(self, action: F) -> Self where F: Fn($a) -> $a {
575                match self {
576                    $enum_var(val) => action(val).into(),
577                    other @ _ => other,
578                }
579            }
580        }
581
582        impl<'a> MapSame_<&'a $a> for $generic< $(&'a $component),* > {
583            fn map_same_<F>(self, action: F) -> Self where F: Fn(&'a $a) -> &'a $a {
584                match self {
585                    $enum_var(val) => action(val).into(),
586                    other @ _ => other,
587                }
588            }
589        }
590    };
591}
592
593#[macro_export]
594macro_rules! fed_promotion {
595    ($generic_0:ident => $generic_1:ident; <$($component_0:ty),*> => <$($component_1:ty),*>; $littletype:ty => $bigtype:ty; $($enum_var:path),+) => {
596        impl ::std::convert::From<$littletype> for $bigtype {
597            fn from(item: $littletype) -> Self {
598                match item {
599                    $(
600                        $enum_var(val) => val.into()
601                    ),+
602                }
603            }
604        }
605
606        impl<'a> ::std::convert::From< $generic_0< $(&'a $component_0),* > > for $generic_1< $(&'a $component_1),* > {
607            fn from(item: $generic_0< $(&'a $component_0),* >) -> Self {
608                match item {
609                    $(
610                        $enum_var(val) => val.into()
611                    ),+
612                }
613            }
614        }
615    };
616}
617
618/// Macro to implement type federation traits for federations of concrete types
619#[macro_export]
620macro_rules! fed {
621    ($($a:ty),+,) => { fed!( $($a),+ ); };
622    ($a:ty) => {
623        // Fed1<A> already generically implemented
624    };
625    ($a:ty, $b:ty)                                           => { fed2!($a, $b);                         };
626    ($a:ty, $b:ty, $c:ty)                                    => { fed3!($a, $b, $c);                     };
627    ($a:ty, $b:ty, $c:ty, $d:ty)                             => { fed4!($a, $b, $c, $d);                 };
628    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty)                      => { fed5!($a, $b, $c, $d, $e);             };
629    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty)               => { fed6!($a, $b, $c, $d, $e, $f);         };
630    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty)        => { fed7!($a, $b, $c, $d, $e, $f, $g);     };
631    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty) => { fed8!($a, $b, $c, $d, $e, $f, $g, $h); };
632}
633
634#[macro_export]
635macro_rules! fed2 {
636    ($a:ty, $b:ty) => {
637        fed2!(Fed2<$a, $b>; $a, $b);
638    };
639    ($a:ty, $b:ty; @without_children) => {
640        fed2!(Fed2<$a, $b>; $a, $b);
641    };
642    ($newtype:ty; $a:ty, $b:ty) => {
643        fed2!($newtype; generic: Fed2; $a, $b; $a, $b);
644    };
645    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty) => {
646        from_fed!($newtype; $generic; $($component),*; $a, Fed2::T1);
647        from_fed!($newtype; $generic; $($component),*; $b, Fed2::T2);
648
649        fed_traits!($newtype; $generic; $($component),*; $a, Fed2::T1, Fed1, $b => Fed2::T2);
650        fed_traits!($newtype; $generic; $($component),*; $b, Fed2::T2, Fed1, $a => Fed2::T1);
651
652        fed_promotion!(Fed1 => Fed2; <$a> => <$a, $b>; Fed1<$a> => Fed2<$a, $b>; Fed1::T1);
653        fed_promotion!(Fed1 => Fed2; <$b> => <$a, $b>; Fed1<$b> => Fed2<$a, $b>; Fed1::T1);
654    };
655}
656
657#[macro_export]
658macro_rules! fed3 {
659    ($a:ty, $b:ty, $c:ty) => {
660        fed3!(Fed3<$a, $b, $c>; $a, $b, $c);
661    };
662    ($a:ty, $b:ty, $c:ty; @without_children) => {
663        fed3!(Fed3<$a, $b, $c>; $a, $b, $c; @without_children);
664    };
665    ($newtype:ty; $a:ty, $b:ty, $c:ty; @without_children) => {
666        fed3!(Fed3<$a, $b, $c>; generic: Fed3; $a, $b, $c; $a, $b, $c; @without_children);
667    };
668    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty; @without_children) => {
669        from_fed!($newtype; $generic; $($component),*; $a, Fed3::T1);
670        from_fed!($newtype; $generic; $($component),*; $b, Fed3::T2);
671        from_fed!($newtype; $generic; $($component),*; $c, Fed3::T3);
672
673        fed_traits!($newtype; $generic; $($component),*; $c, Fed3::T3, Fed2, $a => Fed3::T1, $b => Fed3::T2                );
674        fed_traits!($newtype; $generic; $($component),*; $b, Fed3::T2, Fed2, $a => Fed3::T1,                 $c => Fed3::T3);
675        fed_traits!($newtype; $generic; $($component),*; $a, Fed3::T1, Fed2,                 $b => Fed3::T2, $c => Fed3::T3);
676
677        fed_promotion!(Fed1 => Fed3; <$c> => <$a, $b, $c>; Fed1<$c> => Fed3<$a, $b, $c>; Fed1::T1);
678        fed_promotion!(Fed1 => Fed3; <$b> => <$a, $b, $c>; Fed1<$b> => Fed3<$a, $b, $c>; Fed1::T1);
679        fed_promotion!(Fed1 => Fed3; <$a> => <$a, $b, $c>; Fed1<$a> => Fed3<$a, $b, $c>; Fed1::T1);
680
681        fed_promotion!(Fed2 => Fed3; <$b, $c> => <$a, $b, $c>; Fed2<$b, $c> => Fed3<$a, $b, $c>; Fed2::T1, Fed2::T2);
682        fed_promotion!(Fed2 => Fed3; <$a, $b> => <$a, $b, $c>; Fed2<$a, $b> => Fed3<$a, $b, $c>; Fed2::T1, Fed2::T2);
683        fed_promotion!(Fed2 => Fed3; <$a, $c> => <$a, $b, $c>; Fed2<$a, $c> => Fed3<$a, $b, $c>; Fed2::T1, Fed2::T2);
684
685    };
686    ($newtype:ty; $a:ty, $b:ty, $c:ty) => {
687        fed2!($a, $b;     @without_children);
688        fed2!($a,     $c; @without_children);
689        fed2!(    $b, $c; @without_children);
690
691        fed3!($a, $b, $c; @without_children);
692    };
693}
694
695#[macro_export]
696macro_rules! fed4 {
697    ($a:ty, $b:ty, $c:ty, $d:ty) => {
698        fed4!(Fed4<$a, $b, $c, $d>; $a, $b, $c, $d);
699    };
700    ($a:ty, $b:ty, $c:ty, $d:ty; @without_children) => {
701        fed4!(Fed4<$a, $b, $c, $d>; $a, $b, $c, $d; @without_children);
702    };
703    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty; @without_children) => {
704        fed4!(Fed4<$a, $b, $c, $d>; generic: Fed4; $a, $b, $c, $d; $a, $b, $c, $d; @without_children);
705    };
706    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty, $d:ty; @without_children) => {
707        from_fed!($newtype; $generic; $($component),*; $a, Fed4::T1);
708        from_fed!($newtype; $generic; $($component),*; $b, Fed4::T2);
709        from_fed!($newtype; $generic; $($component),*; $c, Fed4::T3);
710        from_fed!($newtype; $generic; $($component),*; $d, Fed4::T4);
711
712        fed_traits!($newtype; $generic; $($component),*; $d, Fed4::T4, Fed3, $a => Fed4::T1, $b => Fed4::T2, $c => Fed4::T3                );
713        fed_traits!($newtype; $generic; $($component),*; $c, Fed4::T3, Fed3, $a => Fed4::T1, $b => Fed4::T2,                 $d => Fed4::T4);
714        fed_traits!($newtype; $generic; $($component),*; $b, Fed4::T2, Fed3, $a => Fed4::T1,                 $c => Fed4::T3, $d => Fed4::T4);
715        fed_traits!($newtype; $generic; $($component),*; $a, Fed4::T1, Fed3,                 $b => Fed4::T2, $c => Fed4::T3, $d => Fed4::T4);
716
717        fed_promotion!(Fed1 => Fed4; <$d> => <$a, $b, $c, $d>; Fed1<$d> => Fed4<$a, $b, $c, $d>; Fed1::T1);
718        fed_promotion!(Fed1 => Fed4; <$c> => <$a, $b, $c, $d>; Fed1<$c> => Fed4<$a, $b, $c, $d>; Fed1::T1);
719        fed_promotion!(Fed1 => Fed4; <$b> => <$a, $b, $c, $d>; Fed1<$b> => Fed4<$a, $b, $c, $d>; Fed1::T1);
720        fed_promotion!(Fed1 => Fed4; <$a> => <$a, $b, $c, $d>; Fed1<$a> => Fed4<$a, $b, $c, $d>; Fed1::T1);
721
722        fed_promotion!(Fed2 => Fed4; <$c, $d> => <$a, $b, $c, $d>; Fed2<$c, $d> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
723        fed_promotion!(Fed2 => Fed4; <$b, $c> => <$a, $b, $c, $d>; Fed2<$b, $c> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
724        fed_promotion!(Fed2 => Fed4; <$b, $d> => <$a, $b, $c, $d>; Fed2<$b, $d> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
725        fed_promotion!(Fed2 => Fed4; <$a, $b> => <$a, $b, $c, $d>; Fed2<$a, $b> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
726        fed_promotion!(Fed2 => Fed4; <$a, $c> => <$a, $b, $c, $d>; Fed2<$a, $c> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
727        fed_promotion!(Fed2 => Fed4; <$a, $d> => <$a, $b, $c, $d>; Fed2<$a, $d> => Fed4<$a, $b, $c, $d>; Fed2::T1, Fed2::T2);
728
729        fed_promotion!(Fed3 => Fed4; <$b, $c, $d> => <$a, $b, $c, $d>; Fed3<$b, $c, $d> => Fed4<$a, $b, $c, $d>; Fed3::T1, Fed3::T2, Fed3::T3);
730        fed_promotion!(Fed3 => Fed4; <$a, $b, $c> => <$a, $b, $c, $d>; Fed3<$a, $b, $c> => Fed4<$a, $b, $c, $d>; Fed3::T1, Fed3::T2, Fed3::T3);
731        fed_promotion!(Fed3 => Fed4; <$a, $b, $d> => <$a, $b, $c, $d>; Fed3<$a, $b, $d> => Fed4<$a, $b, $c, $d>; Fed3::T1, Fed3::T2, Fed3::T3);
732        fed_promotion!(Fed3 => Fed4; <$a, $c, $d> => <$a, $b, $c, $d>; Fed3<$a, $c, $d> => Fed4<$a, $b, $c, $d>; Fed3::T1, Fed3::T2, Fed3::T3);
733
734    };
735    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty) => {
736        fed3!($a, $b, $c;     @without_children);
737        fed3!($a, $b,     $d; @without_children);
738        fed3!($a,     $c, $d; @without_children);
739        fed3!(    $b, $c, $d; @without_children);
740
741        fed2!($a, $b;         @without_children);
742        fed2!($a,     $c;     @without_children);
743        fed2!($a,         $d; @without_children);
744        fed2!(    $b, $c;     @without_children);
745        fed2!(    $b,     $d; @without_children);
746        fed2!(        $c, $d; @without_children);
747
748        fed4!($newtype; $a, $b, $c, $d; @without_children);
749    };
750}
751
752#[macro_export]
753macro_rules! fed5 {
754    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty) => {
755        fed5!(Fed5<$a, $b, $c, $d, $e>; $a, $b, $c, $d, $e);
756    };
757    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty; @without_children) => {
758        fed5!(Fed5<$a, $b, $c, $d, $e>; $a, $b, $c, $d, $e; @without_children);
759    };
760    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty; @without_children) => {
761        fed5!(Fed5<$a, $b, $c, $d, $e>; generic: Fed5; $a, $b, $c, $d, $e; $a, $b, $c, $d, $e; @without_children);
762    };
763    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty; @without_children) => {
764        from_fed!($newtype; $generic; $($component),*; $a, Fed5::T1);
765        from_fed!($newtype; $generic; $($component),*; $b, Fed5::T2);
766        from_fed!($newtype; $generic; $($component),*; $c, Fed5::T3);
767        from_fed!($newtype; $generic; $($component),*; $d, Fed5::T4);
768        from_fed!($newtype; $generic; $($component),*; $e, Fed5::T5);
769
770        fed_traits!($newtype; $generic; $($component),*; $e, Fed5::T5, Fed4, $a => Fed5::T1, $b => Fed5::T2, $c => Fed5::T3, $d => Fed5::T4                );
771        fed_traits!($newtype; $generic; $($component),*; $d, Fed5::T4, Fed4, $a => Fed5::T1, $b => Fed5::T2, $c => Fed5::T3,                 $e => Fed5::T5);
772        fed_traits!($newtype; $generic; $($component),*; $c, Fed5::T3, Fed4, $a => Fed5::T1, $b => Fed5::T2,                 $d => Fed5::T4, $e => Fed5::T5);
773        fed_traits!($newtype; $generic; $($component),*; $b, Fed5::T2, Fed4, $a => Fed5::T1,                 $c => Fed5::T3, $d => Fed5::T4, $e => Fed5::T5);
774        fed_traits!($newtype; $generic; $($component),*; $a, Fed5::T1, Fed4,                 $b => Fed5::T2, $c => Fed5::T3, $d => Fed5::T4, $e => Fed5::T5);
775
776        fed_promotion!(Fed1 => Fed5; <$e> => <$a, $b, $c, $d, $e>; Fed1<$e> => Fed5<$a, $b, $c, $d, $e>; Fed1::T1);
777        fed_promotion!(Fed1 => Fed5; <$d> => <$a, $b, $c, $d, $e>; Fed1<$d> => Fed5<$a, $b, $c, $d, $e>; Fed1::T1);
778        fed_promotion!(Fed1 => Fed5; <$c> => <$a, $b, $c, $d, $e>; Fed1<$c> => Fed5<$a, $b, $c, $d, $e>; Fed1::T1);
779        fed_promotion!(Fed1 => Fed5; <$b> => <$a, $b, $c, $d, $e>; Fed1<$b> => Fed5<$a, $b, $c, $d, $e>; Fed1::T1);
780        fed_promotion!(Fed1 => Fed5; <$a> => <$a, $b, $c, $d, $e>; Fed1<$a> => Fed5<$a, $b, $c, $d, $e>; Fed1::T1);
781
782        fed_promotion!(Fed2 => Fed5; <$d, $e> => <$a, $b, $c, $d, $e>; Fed2<$d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
783        fed_promotion!(Fed2 => Fed5; <$c, $d> => <$a, $b, $c, $d, $e>; Fed2<$c, $d> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
784        fed_promotion!(Fed2 => Fed5; <$c, $e> => <$a, $b, $c, $d, $e>; Fed2<$c, $e> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
785        fed_promotion!(Fed2 => Fed5; <$b, $c> => <$a, $b, $c, $d, $e>; Fed2<$b, $c> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
786        fed_promotion!(Fed2 => Fed5; <$b, $d> => <$a, $b, $c, $d, $e>; Fed2<$b, $d> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
787        fed_promotion!(Fed2 => Fed5; <$b, $e> => <$a, $b, $c, $d, $e>; Fed2<$b, $e> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
788        fed_promotion!(Fed2 => Fed5; <$a, $b> => <$a, $b, $c, $d, $e>; Fed2<$a, $b> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
789        fed_promotion!(Fed2 => Fed5; <$a, $c> => <$a, $b, $c, $d, $e>; Fed2<$a, $c> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
790        fed_promotion!(Fed2 => Fed5; <$a, $d> => <$a, $b, $c, $d, $e>; Fed2<$a, $d> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
791        fed_promotion!(Fed2 => Fed5; <$a, $e> => <$a, $b, $c, $d, $e>; Fed2<$a, $e> => Fed5<$a, $b, $c, $d, $e>; Fed2::T1, Fed2::T2);
792
793        fed_promotion!(Fed3 => Fed5; <$c, $d, $e> => <$a, $b, $c, $d, $e>; Fed3<$c, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
794        fed_promotion!(Fed3 => Fed5; <$b, $c, $d> => <$a, $b, $c, $d, $e>; Fed3<$b, $c, $d> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
795        fed_promotion!(Fed3 => Fed5; <$b, $c, $e> => <$a, $b, $c, $d, $e>; Fed3<$b, $c, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
796        fed_promotion!(Fed3 => Fed5; <$b, $d, $e> => <$a, $b, $c, $d, $e>; Fed3<$b, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
797        fed_promotion!(Fed3 => Fed5; <$a, $b, $c> => <$a, $b, $c, $d, $e>; Fed3<$a, $b, $c> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
798        fed_promotion!(Fed3 => Fed5; <$a, $b, $d> => <$a, $b, $c, $d, $e>; Fed3<$a, $b, $d> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
799        fed_promotion!(Fed3 => Fed5; <$a, $b, $e> => <$a, $b, $c, $d, $e>; Fed3<$a, $b, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
800        fed_promotion!(Fed3 => Fed5; <$a, $c, $d> => <$a, $b, $c, $d, $e>; Fed3<$a, $c, $d> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
801        fed_promotion!(Fed3 => Fed5; <$a, $c, $e> => <$a, $b, $c, $d, $e>; Fed3<$a, $c, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
802        fed_promotion!(Fed3 => Fed5; <$a, $d, $e> => <$a, $b, $c, $d, $e>; Fed3<$a, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed3::T1, Fed3::T2, Fed3::T3);
803
804        fed_promotion!(Fed4 => Fed5; <$b, $c, $d, $e> => <$a, $b, $c, $d, $e>; Fed4<$b, $c, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
805        fed_promotion!(Fed4 => Fed5; <$a, $b, $c, $d> => <$a, $b, $c, $d, $e>; Fed4<$a, $b, $c, $d> => Fed5<$a, $b, $c, $d, $e>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
806        fed_promotion!(Fed4 => Fed5; <$a, $b, $c, $e> => <$a, $b, $c, $d, $e>; Fed4<$a, $b, $c, $e> => Fed5<$a, $b, $c, $d, $e>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
807        fed_promotion!(Fed4 => Fed5; <$a, $b, $d, $e> => <$a, $b, $c, $d, $e>; Fed4<$a, $b, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
808        fed_promotion!(Fed4 => Fed5; <$a, $c, $d, $e> => <$a, $b, $c, $d, $e>; Fed4<$a, $c, $d, $e> => Fed5<$a, $b, $c, $d, $e>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
809
810    };
811    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty) => {
812        fed4!($a, $b, $c, $d;     @without_children);
813        fed4!($a, $b, $c,     $e; @without_children);
814        fed4!($a, $b,     $d, $e; @without_children);
815        fed4!($a,     $c, $d, $e; @without_children);
816        fed4!(    $b, $c, $d, $e; @without_children);
817
818        fed3!($a, $b, $c;         @without_children);
819        fed3!($a, $b,     $d;     @without_children);
820        fed3!($a, $b,         $e; @without_children);
821        fed3!($a,     $c, $d;     @without_children);
822        fed3!($a,     $c,     $e; @without_children);
823        fed3!($a, $d,         $e; @without_children);
824        fed3!(    $b, $c, $d;     @without_children);
825        fed3!(    $b, $c,     $e; @without_children);
826        fed3!(    $b,     $d, $e; @without_children);
827        fed3!(        $c, $d, $e; @without_children);
828
829        fed2!($a, $b;             @without_children);
830        fed2!($a,     $c;         @without_children);
831        fed2!($a,         $d;     @without_children);
832        fed2!($a,             $e; @without_children);
833        fed2!(    $b, $c;         @without_children);
834        fed2!(    $b,     $d;     @without_children);
835        fed2!(    $b,         $e; @without_children);
836        fed2!(        $c, $d;     @without_children);
837        fed2!(        $c,     $e; @without_children);
838        fed2!(            $d, $e; @without_children);
839
840        fed5!($newtype; $a, $b, $c, $d, $e; @without_children);
841    };
842}
843
844#[macro_export]
845macro_rules! fed6 {
846    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty) => {
847        fed6!(Fed6<$a, $b, $c, $d, $e, $f>; $a, $b, $c, $d, $e, $f);
848    };
849    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty; @without_children) => {
850        fed6!(Fed6<$a, $b, $c, $d, $e, $f>; $a, $b, $c, $d, $e, $f; @without_children);
851    };
852    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty; @without_children) => {
853        fed6!(Fed6<$a, $b, $c, $d, $e, $f>; generic: Fed6; $a, $b, $c, $d, $e, $f; $a, $b, $c, $d, $e, $f; @without_children);
854    };
855    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty; @without_children) => {
856        from_fed!($newtype; $generic; $($component),*; $a, Fed6::T1);
857        from_fed!($newtype; $generic; $($component),*; $b, Fed6::T2);
858        from_fed!($newtype; $generic; $($component),*; $c, Fed6::T3);
859        from_fed!($newtype; $generic; $($component),*; $d, Fed6::T4);
860        from_fed!($newtype; $generic; $($component),*; $e, Fed6::T5);
861        from_fed!($newtype; $generic; $($component),*; $f, Fed6::T6);
862
863        fed_traits!($newtype; $generic; $($component),*; $f, Fed6::T6, Fed5, $a => Fed6::T1, $b => Fed6::T2, $c => Fed6::T3, $d => Fed6::T4, $e => Fed6::T5                );
864        fed_traits!($newtype; $generic; $($component),*; $e, Fed6::T5, Fed5, $a => Fed6::T1, $b => Fed6::T2, $c => Fed6::T3, $d => Fed6::T4,                 $f => Fed6::T6);
865        fed_traits!($newtype; $generic; $($component),*; $d, Fed6::T4, Fed5, $a => Fed6::T1, $b => Fed6::T2, $c => Fed6::T3,                 $e => Fed6::T5, $f => Fed6::T6);
866        fed_traits!($newtype; $generic; $($component),*; $c, Fed6::T3, Fed5, $a => Fed6::T1, $b => Fed6::T2,                 $d => Fed6::T4, $e => Fed6::T5, $f => Fed6::T6);
867        fed_traits!($newtype; $generic; $($component),*; $b, Fed6::T2, Fed5, $a => Fed6::T1,                 $c => Fed6::T3, $d => Fed6::T4, $e => Fed6::T5, $f => Fed6::T6);
868        fed_traits!($newtype; $generic; $($component),*; $a, Fed6::T1, Fed5,                 $b => Fed6::T2, $c => Fed6::T3, $d => Fed6::T4, $e => Fed6::T5, $f => Fed6::T6);
869
870        fed_promotion!(Fed1 => Fed6; <$f> => <$a, $b, $c, $d, $e, $f>; Fed1<$f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
871        fed_promotion!(Fed1 => Fed6; <$e> => <$a, $b, $c, $d, $e, $f>; Fed1<$e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
872        fed_promotion!(Fed1 => Fed6; <$d> => <$a, $b, $c, $d, $e, $f>; Fed1<$d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
873        fed_promotion!(Fed1 => Fed6; <$c> => <$a, $b, $c, $d, $e, $f>; Fed1<$c> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
874        fed_promotion!(Fed1 => Fed6; <$b> => <$a, $b, $c, $d, $e, $f>; Fed1<$b> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
875        fed_promotion!(Fed1 => Fed6; <$a> => <$a, $b, $c, $d, $e, $f>; Fed1<$a> => Fed6<$a, $b, $c, $d, $e, $f>; Fed1::T1);
876
877        fed_promotion!(Fed2 => Fed6; <$e, $f> => <$a, $b, $c, $d, $e, $f>; Fed2<$e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
878        fed_promotion!(Fed2 => Fed6; <$d, $e> => <$a, $b, $c, $d, $e, $f>; Fed2<$d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
879        fed_promotion!(Fed2 => Fed6; <$d, $f> => <$a, $b, $c, $d, $e, $f>; Fed2<$d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
880        fed_promotion!(Fed2 => Fed6; <$c, $d> => <$a, $b, $c, $d, $e, $f>; Fed2<$c, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
881        fed_promotion!(Fed2 => Fed6; <$c, $e> => <$a, $b, $c, $d, $e, $f>; Fed2<$c, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
882        fed_promotion!(Fed2 => Fed6; <$c, $f> => <$a, $b, $c, $d, $e, $f>; Fed2<$c, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
883        fed_promotion!(Fed2 => Fed6; <$b, $c> => <$a, $b, $c, $d, $e, $f>; Fed2<$b, $c> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
884        fed_promotion!(Fed2 => Fed6; <$b, $d> => <$a, $b, $c, $d, $e, $f>; Fed2<$b, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
885        fed_promotion!(Fed2 => Fed6; <$b, $e> => <$a, $b, $c, $d, $e, $f>; Fed2<$b, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
886        fed_promotion!(Fed2 => Fed6; <$b, $f> => <$a, $b, $c, $d, $e, $f>; Fed2<$b, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
887        fed_promotion!(Fed2 => Fed6; <$a, $b> => <$a, $b, $c, $d, $e, $f>; Fed2<$a, $b> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
888        fed_promotion!(Fed2 => Fed6; <$a, $c> => <$a, $b, $c, $d, $e, $f>; Fed2<$a, $c> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
889        fed_promotion!(Fed2 => Fed6; <$a, $d> => <$a, $b, $c, $d, $e, $f>; Fed2<$a, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
890        fed_promotion!(Fed2 => Fed6; <$a, $e> => <$a, $b, $c, $d, $e, $f>; Fed2<$a, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
891        fed_promotion!(Fed2 => Fed6; <$a, $f> => <$a, $b, $c, $d, $e, $f>; Fed2<$a, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed2::T1, Fed2::T2);
892
893        fed_promotion!(Fed3 => Fed6; <$d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
894        fed_promotion!(Fed3 => Fed6; <$c, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$c, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
895        fed_promotion!(Fed3 => Fed6; <$c, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$c, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
896        fed_promotion!(Fed3 => Fed6; <$c, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$c, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
897        fed_promotion!(Fed3 => Fed6; <$b, $c, $d> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $c, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
898        fed_promotion!(Fed3 => Fed6; <$b, $c, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $c, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
899        fed_promotion!(Fed3 => Fed6; <$b, $c, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $c, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
900        fed_promotion!(Fed3 => Fed6; <$b, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
901        fed_promotion!(Fed3 => Fed6; <$b, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
902        fed_promotion!(Fed3 => Fed6; <$b, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$b, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
903        fed_promotion!(Fed3 => Fed6; <$a, $b, $c> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $b, $c> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
904        fed_promotion!(Fed3 => Fed6; <$a, $b, $d> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $b, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
905        fed_promotion!(Fed3 => Fed6; <$a, $b, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $b, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
906        fed_promotion!(Fed3 => Fed6; <$a, $b, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $b, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
907        fed_promotion!(Fed3 => Fed6; <$a, $c, $d> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $c, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
908        fed_promotion!(Fed3 => Fed6; <$a, $c, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $c, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
909        fed_promotion!(Fed3 => Fed6; <$a, $c, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $c, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
910        fed_promotion!(Fed3 => Fed6; <$a, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
911        fed_promotion!(Fed3 => Fed6; <$a, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
912        fed_promotion!(Fed3 => Fed6; <$a, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed3<$a, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed3::T1, Fed3::T2, Fed3::T3);
913
914        fed_promotion!(Fed4 => Fed6; <$c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$c, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
915        fed_promotion!(Fed4 => Fed6; <$b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed4<$b, $c, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
916        fed_promotion!(Fed4 => Fed6; <$b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$b, $c, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
917        fed_promotion!(Fed4 => Fed6; <$b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$b, $c, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
918        fed_promotion!(Fed4 => Fed6; <$b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$b, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
919        fed_promotion!(Fed4 => Fed6; <$a, $b, $c, $d> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $c, $d> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
920        fed_promotion!(Fed4 => Fed6; <$a, $b, $c, $e> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $c, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
921        fed_promotion!(Fed4 => Fed6; <$a, $b, $c, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $c, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
922        fed_promotion!(Fed4 => Fed6; <$a, $b, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
923        fed_promotion!(Fed4 => Fed6; <$a, $b, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
924        fed_promotion!(Fed4 => Fed6; <$a, $b, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $b, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
925        fed_promotion!(Fed4 => Fed6; <$a, $c, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $c, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
926        fed_promotion!(Fed4 => Fed6; <$a, $c, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $c, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
927        fed_promotion!(Fed4 => Fed6; <$a, $c, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $c, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
928        fed_promotion!(Fed4 => Fed6; <$a, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed4<$a, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
929
930        fed_promotion!(Fed5 => Fed6; <$b, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed5<$b, $c, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
931        fed_promotion!(Fed5 => Fed6; <$a, $b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f>; Fed5<$a, $b, $c, $d, $e> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
932        fed_promotion!(Fed5 => Fed6; <$a, $b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f>; Fed5<$a, $b, $c, $d, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
933        fed_promotion!(Fed5 => Fed6; <$a, $b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed5<$a, $b, $c, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
934        fed_promotion!(Fed5 => Fed6; <$a, $b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed5<$a, $b, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
935        fed_promotion!(Fed5 => Fed6; <$a, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f>; Fed5<$a, $c, $d, $e, $f> => Fed6<$a, $b, $c, $d, $e, $f>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
936
937    };
938    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty) => {
939        fed5!($a, $b, $c, $d, $e;     @without_children);
940        fed5!($a, $b, $c, $d,     $f; @without_children);
941        fed5!($a, $b, $c,     $e, $f; @without_children);
942        fed5!($a, $b,     $d, $e, $f; @without_children);
943        fed5!($a,     $c, $d, $e, $f; @without_children);
944        fed5!(    $b, $c, $d, $e, $f; @without_children);
945
946        fed4!($a, $b, $c, $d;         @without_children);
947        fed4!($a, $b, $c,     $e;     @without_children);
948        fed4!($a, $b, $c,         $f; @without_children);
949        fed4!($a, $b,     $d, $e;     @without_children);
950        fed4!($a, $b,     $d,     $f; @without_children);
951        fed4!($a, $b,         $e, $f; @without_children);
952        fed4!($a,     $c, $d, $e;     @without_children);
953        fed4!($a,     $c, $d,     $f; @without_children);
954        fed4!($a,     $c,     $e, $f; @without_children);
955        fed4!($a,         $d, $e, $f; @without_children);
956        fed4!(    $b, $c, $d, $e;     @without_children);
957        fed4!(    $b, $c, $d,     $f; @without_children);
958        fed4!(    $b, $c,     $e, $f; @without_children);
959        fed4!(    $b,     $d, $e, $f; @without_children);
960        fed4!(        $c, $d, $e, $f; @without_children);
961
962        fed3!($a, $b, $c;             @without_children);
963        fed3!($a, $b,     $d;         @without_children);
964        fed3!($a, $b,         $e;     @without_children);
965        fed3!($a,     $c, $d;         @without_children);
966        fed3!($a,     $c,     $e;     @without_children);
967        fed3!($a,         $d, $e;     @without_children);
968        fed3!(    $b, $c, $d;         @without_children);
969        fed3!(    $b, $c,     $e;     @without_children);
970        fed3!(    $b,     $d, $e;     @without_children);
971        fed3!(        $c, $d, $e;     @without_children);
972        fed3!($a, $b,             $f; @without_children);
973        fed3!($a,     $c,         $f; @without_children);
974        fed3!($a,         $d,     $f; @without_children);
975        fed3!($a,             $e, $f; @without_children);
976        fed3!(    $b, $c,         $f; @without_children);
977        fed3!(    $b,     $d,     $f; @without_children);
978        fed3!(    $b,         $e, $f; @without_children);
979        fed3!(        $c, $d,     $f; @without_children);
980        fed3!(        $c,     $e, $f; @without_children);
981        fed3!(            $d, $e, $f; @without_children);
982
983        fed2!($a, $b;                 @without_children);
984        fed2!($a,     $c;             @without_children);
985        fed2!($a,         $d;         @without_children);
986        fed2!($a,             $e;     @without_children);
987        fed2!($a,                 $f; @without_children);
988        fed2!(    $b, $c;             @without_children);
989        fed2!(    $b,     $d;         @without_children);
990        fed2!(    $b,         $e;     @without_children);
991        fed2!(    $b,             $f; @without_children);
992        fed2!(        $c, $d;         @without_children);
993        fed2!(        $c,     $e;     @without_children);
994        fed2!(        $c,         $f; @without_children);
995        fed2!(            $d, $e;     @without_children);
996        fed2!(            $d,     $f; @without_children);
997        fed2!(                $e, $f; @without_children);
998
999        fed6!($newtype; $a, $b, $c, $d, $e, $f; @without_children);
1000    };
1001}
1002
1003#[macro_export]
1004macro_rules! fed7 {
1005    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty) => {
1006        fed7!(Fed7<$a, $b, $c, $d, $e, $f, $g>; $a, $b, $c, $d, $e, $f, $g);
1007    };
1008    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty; @without_children) => {
1009        fed7!(Fed7<$a, $b, $c, $d, $e, $f, $g>; $a, $b, $c, $d, $e, $f, $g; @without_children);
1010    };
1011    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty; @without_children) => {
1012        fed7!(Fed7<$a, $b, $c, $d, $e, $f, $g>; generic: Fed7; $a, $b, $c, $d, $e, $f, $g; $a, $b, $c, $d, $e, $f, $g; @without_children);
1013    };
1014    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty; @without_children) => {
1015        from_fed!($newtype; $generic; $($component),*; $a, Fed7::T1);
1016        from_fed!($newtype; $generic; $($component),*; $b, Fed7::T2);
1017        from_fed!($newtype; $generic; $($component),*; $c, Fed7::T3);
1018        from_fed!($newtype; $generic; $($component),*; $d, Fed7::T4);
1019        from_fed!($newtype; $generic; $($component),*; $e, Fed7::T5);
1020        from_fed!($newtype; $generic; $($component),*; $f, Fed7::T6);
1021        from_fed!($newtype; $generic; $($component),*; $g, Fed7::T7);
1022
1023        fed_traits!($newtype; $generic; $($component),*; $g, Fed7::T7, Fed6, $a => Fed7::T1, $b => Fed7::T2, $c => Fed7::T3, $d => Fed7::T4, $e => Fed7::T5, $f => Fed7::T6                );
1024        fed_traits!($newtype; $generic; $($component),*; $f, Fed7::T6, Fed6, $a => Fed7::T1, $b => Fed7::T2, $c => Fed7::T3, $d => Fed7::T4, $e => Fed7::T5,                 $g => Fed7::T7);
1025        fed_traits!($newtype; $generic; $($component),*; $e, Fed7::T5, Fed6, $a => Fed7::T1, $b => Fed7::T2, $c => Fed7::T3, $d => Fed7::T4,                 $f => Fed7::T6, $g => Fed7::T7);
1026        fed_traits!($newtype; $generic; $($component),*; $d, Fed7::T4, Fed6, $a => Fed7::T1, $b => Fed7::T2, $c => Fed7::T3,                 $e => Fed7::T5, $f => Fed7::T6, $g => Fed7::T7);
1027        fed_traits!($newtype; $generic; $($component),*; $c, Fed7::T3, Fed6, $a => Fed7::T1, $b => Fed7::T2,                 $d => Fed7::T4, $e => Fed7::T5, $f => Fed7::T6, $g => Fed7::T7);
1028        fed_traits!($newtype; $generic; $($component),*; $b, Fed7::T2, Fed6, $a => Fed7::T1,                 $c => Fed7::T3, $d => Fed7::T4, $e => Fed7::T5, $f => Fed7::T6, $g => Fed7::T7);
1029        fed_traits!($newtype; $generic; $($component),*; $a, Fed7::T1, Fed6,                 $b => Fed7::T2, $c => Fed7::T3, $d => Fed7::T4, $e => Fed7::T5, $f => Fed7::T6, $g => Fed7::T7);
1030
1031        fed_promotion!(Fed1 => Fed7; <$g> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1032        fed_promotion!(Fed1 => Fed7; <$f> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1033        fed_promotion!(Fed1 => Fed7; <$e> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1034        fed_promotion!(Fed1 => Fed7; <$d> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1035        fed_promotion!(Fed1 => Fed7; <$c> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$c> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1036        fed_promotion!(Fed1 => Fed7; <$b> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$b> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1037        fed_promotion!(Fed1 => Fed7; <$a> => <$a, $b, $c, $d, $e, $f, $g>; Fed1<$a> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed1::T1);
1038
1039        fed_promotion!(Fed2 => Fed7; <$f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1040        fed_promotion!(Fed2 => Fed7; <$e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1041        fed_promotion!(Fed2 => Fed7; <$e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1042        fed_promotion!(Fed2 => Fed7; <$d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1043        fed_promotion!(Fed2 => Fed7; <$d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1044        fed_promotion!(Fed2 => Fed7; <$d, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$d, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1045        fed_promotion!(Fed2 => Fed7; <$c, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$c, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1046        fed_promotion!(Fed2 => Fed7; <$c, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$c, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1047        fed_promotion!(Fed2 => Fed7; <$c, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$c, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1048        fed_promotion!(Fed2 => Fed7; <$c, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$c, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1049        fed_promotion!(Fed2 => Fed7; <$b, $c> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$b, $c> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1050        fed_promotion!(Fed2 => Fed7; <$b, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$b, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1051        fed_promotion!(Fed2 => Fed7; <$b, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$b, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1052        fed_promotion!(Fed2 => Fed7; <$b, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$b, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1053        fed_promotion!(Fed2 => Fed7; <$b, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$b, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1054        fed_promotion!(Fed2 => Fed7; <$a, $b> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $b> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1055        fed_promotion!(Fed2 => Fed7; <$a, $c> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $c> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1056        fed_promotion!(Fed2 => Fed7; <$a, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1057        fed_promotion!(Fed2 => Fed7; <$a, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1058        fed_promotion!(Fed2 => Fed7; <$a, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1059        fed_promotion!(Fed2 => Fed7; <$a, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed2<$a, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed2::T1, Fed2::T2);
1060
1061        fed_promotion!(Fed3 => Fed7; <$e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1062        fed_promotion!(Fed3 => Fed7; <$d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1063        fed_promotion!(Fed3 => Fed7; <$d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1064        fed_promotion!(Fed3 => Fed7; <$d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1065        fed_promotion!(Fed3 => Fed7; <$c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1066        fed_promotion!(Fed3 => Fed7; <$c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1067        fed_promotion!(Fed3 => Fed7; <$c, $d, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $d, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1068        fed_promotion!(Fed3 => Fed7; <$c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1069        fed_promotion!(Fed3 => Fed7; <$c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1070        fed_promotion!(Fed3 => Fed7; <$c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$c, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1071        fed_promotion!(Fed3 => Fed7; <$b, $c, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $c, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1072        fed_promotion!(Fed3 => Fed7; <$b, $c, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $c, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1073        fed_promotion!(Fed3 => Fed7; <$b, $c, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $c, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1074        fed_promotion!(Fed3 => Fed7; <$b, $c, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $c, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1075        fed_promotion!(Fed3 => Fed7; <$b, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1076        fed_promotion!(Fed3 => Fed7; <$b, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1077        fed_promotion!(Fed3 => Fed7; <$b, $d, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $d, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1078        fed_promotion!(Fed3 => Fed7; <$b, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1079        fed_promotion!(Fed3 => Fed7; <$b, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1080        fed_promotion!(Fed3 => Fed7; <$b, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$b, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1081        fed_promotion!(Fed3 => Fed7; <$a, $b, $c> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $b, $c> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1082        fed_promotion!(Fed3 => Fed7; <$a, $b, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $b, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1083        fed_promotion!(Fed3 => Fed7; <$a, $b, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $b, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1084        fed_promotion!(Fed3 => Fed7; <$a, $b, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $b, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1085        fed_promotion!(Fed3 => Fed7; <$a, $b, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $b, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1086        fed_promotion!(Fed3 => Fed7; <$a, $c, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $c, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1087        fed_promotion!(Fed3 => Fed7; <$a, $c, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $c, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1088        fed_promotion!(Fed3 => Fed7; <$a, $c, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $c, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1089        fed_promotion!(Fed3 => Fed7; <$a, $c, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $c, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1090        fed_promotion!(Fed3 => Fed7; <$a, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1091        fed_promotion!(Fed3 => Fed7; <$a, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1092        fed_promotion!(Fed3 => Fed7; <$a, $d, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $d, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1093        fed_promotion!(Fed3 => Fed7; <$a, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1094        fed_promotion!(Fed3 => Fed7; <$a, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1095        fed_promotion!(Fed3 => Fed7; <$a, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed3<$a, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed3::T1, Fed3::T2, Fed3::T3);
1096
1097
1098        fed_promotion!(Fed4 => Fed7; <$d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1099        fed_promotion!(Fed4 => Fed7; <$c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$c, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1100        fed_promotion!(Fed4 => Fed7; <$c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$c, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1101        fed_promotion!(Fed4 => Fed7; <$c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$c, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1102        fed_promotion!(Fed4 => Fed7; <$c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$c, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1103        fed_promotion!(Fed4 => Fed7; <$b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $c, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1104        fed_promotion!(Fed4 => Fed7; <$b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $c, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1105        fed_promotion!(Fed4 => Fed7; <$b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $c, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1106        fed_promotion!(Fed4 => Fed7; <$b, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $c, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1107        fed_promotion!(Fed4 => Fed7; <$b, $c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $c, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1108        fed_promotion!(Fed4 => Fed7; <$b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1109        fed_promotion!(Fed4 => Fed7; <$b, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1110        fed_promotion!(Fed4 => Fed7; <$b, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1111        fed_promotion!(Fed4 => Fed7; <$b, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$b, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1112        fed_promotion!(Fed4 => Fed7; <$a, $b, $c, $d> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $c, $d> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1113        fed_promotion!(Fed4 => Fed7; <$a, $b, $c, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $c, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1114        fed_promotion!(Fed4 => Fed7; <$a, $b, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1115        fed_promotion!(Fed4 => Fed7; <$a, $b, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1116        fed_promotion!(Fed4 => Fed7; <$a, $b, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1117        fed_promotion!(Fed4 => Fed7; <$a, $b, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1118        fed_promotion!(Fed4 => Fed7; <$a, $b, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $b, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1119        fed_promotion!(Fed4 => Fed7; <$a, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $c, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1120        fed_promotion!(Fed4 => Fed7; <$a, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $c, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1121        fed_promotion!(Fed4 => Fed7; <$a, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $c, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1122        fed_promotion!(Fed4 => Fed7; <$a, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $c, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1123        fed_promotion!(Fed4 => Fed7; <$a, $c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $c, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1124        fed_promotion!(Fed4 => Fed7; <$a, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1125        fed_promotion!(Fed4 => Fed7; <$a, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1126        fed_promotion!(Fed4 => Fed7; <$a, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1127        fed_promotion!(Fed4 => Fed7; <$a, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed4<$a, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1128
1129
1130        fed_promotion!(Fed5 => Fed7; <$c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$c, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1131        fed_promotion!(Fed5 => Fed7; <$b, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$b, $c, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1132        fed_promotion!(Fed5 => Fed7; <$b, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$b, $c, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1133        fed_promotion!(Fed5 => Fed7; <$b, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$b, $c, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1134        fed_promotion!(Fed5 => Fed7; <$b, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$b, $c, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1135        fed_promotion!(Fed5 => Fed7; <$b, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$b, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1136        fed_promotion!(Fed5 => Fed7; <$a, $b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $c, $d, $e> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1137        fed_promotion!(Fed5 => Fed7; <$a, $b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $c, $d, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1138        fed_promotion!(Fed5 => Fed7; <$a, $b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $c, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1139        fed_promotion!(Fed5 => Fed7; <$a, $b, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $c, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1140        fed_promotion!(Fed5 => Fed7; <$a, $b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1141        fed_promotion!(Fed5 => Fed7; <$a, $b, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1142        fed_promotion!(Fed5 => Fed7; <$a, $b, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1143        fed_promotion!(Fed5 => Fed7; <$a, $b, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $b, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1144        fed_promotion!(Fed5 => Fed7; <$a, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $c, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1145        fed_promotion!(Fed5 => Fed7; <$a, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $c, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1146        fed_promotion!(Fed5 => Fed7; <$a, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $c, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1147        fed_promotion!(Fed5 => Fed7; <$a, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $c, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1148        fed_promotion!(Fed5 => Fed7; <$a, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed5<$a, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1149
1150
1151        fed_promotion!(Fed6 => Fed7; <$b, $c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$b, $c, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1152        fed_promotion!(Fed6 => Fed7; <$a, $b, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $b, $c, $d, $e, $f> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1153        fed_promotion!(Fed6 => Fed7; <$a, $b, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $b, $c, $d, $e, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1154        fed_promotion!(Fed6 => Fed7; <$a, $b, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $b, $c, $d, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1155        fed_promotion!(Fed6 => Fed7; <$a, $b, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $b, $c, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1156        fed_promotion!(Fed6 => Fed7; <$a, $b, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $b, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1157        fed_promotion!(Fed6 => Fed7; <$a, $c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g>; Fed6<$a, $c, $d, $e, $f, $g> => Fed7<$a, $b, $c, $d, $e, $f, $g>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1158
1159    };
1160    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty) => {
1161        fed6!($a, $b, $c, $d, $e, $f;     @without_children);
1162        fed6!($a, $b, $c, $d, $e,     $g; @without_children);
1163        fed6!($a, $b, $c, $d,     $f, $g; @without_children);
1164        fed6!($a, $b, $c,     $e, $f, $g; @without_children);
1165        fed6!($a, $b,     $d, $e, $f, $g; @without_children);
1166        fed6!($a,     $c, $d, $e, $f, $g; @without_children);
1167        fed6!(    $b, $c, $d, $e, $f, $g; @without_children);
1168
1169        fed5!($a, $b, $c, $d, $e;         @without_children);
1170        fed5!($a, $b, $c, $d,     $f;     @without_children);
1171        fed5!($a, $b, $c,     $e, $f;     @without_children);
1172        fed5!($a, $b,     $d, $e, $f;     @without_children);
1173        fed5!($a,     $c, $d, $e, $f;     @without_children);
1174        fed5!(    $b, $c, $d, $e, $f;     @without_children);
1175        //
1176        fed5!($a, $b, $c, $d,         $g; @without_children);
1177        fed5!($a, $b, $c,     $e,     $g; @without_children);
1178        fed5!($a, $b, $c,         $f, $g; @without_children);
1179        fed5!($a, $b,     $d, $e,     $g; @without_children);
1180        fed5!($a, $b,     $d,     $f, $g; @without_children);
1181        fed5!($a, $b,         $e, $f, $g; @without_children);
1182        fed5!($a,     $c, $d, $e,     $g; @without_children);
1183        fed5!($a,     $c, $d,     $f, $g; @without_children);
1184        fed5!($a,     $c,     $e, $f, $g; @without_children);
1185        fed5!($a,         $d, $e, $f, $g; @without_children);
1186        fed5!(    $b, $c, $d, $e,     $g; @without_children);
1187        fed5!(    $b, $c, $d,     $f, $g; @without_children);
1188        fed5!(    $b, $c,     $e, $f, $g; @without_children);
1189        fed5!(    $b,     $d, $e, $f, $g; @without_children);
1190        fed5!(        $c, $d, $e, $f, $g; @without_children);
1191
1192        fed4!($a, $b, $c, $d;             @without_children);
1193        fed4!($a, $b, $c,     $e;         @without_children);
1194        fed4!($a, $b, $c,         $f;     @without_children);
1195        fed4!($a, $b,     $d, $e;         @without_children);
1196        fed4!($a, $b,     $d,     $f;     @without_children);
1197        fed4!($a, $b,         $e, $f;     @without_children);
1198        fed4!($a,     $c, $d, $e;         @without_children);
1199        fed4!($a,     $c, $d,     $f;     @without_children);
1200        fed4!($a,     $c,     $e, $f;     @without_children);
1201        fed4!($a,         $d, $e, $f;     @without_children);
1202        fed4!(    $b, $c, $d, $e;         @without_children);
1203        fed4!(    $b, $c, $d,     $f;     @without_children);
1204        fed4!(    $b, $c,     $e, $f;     @without_children);
1205        fed4!(    $b,     $d, $e, $f;     @without_children);
1206        fed4!(        $c, $d, $e, $f;     @without_children);
1207        //
1208        fed4!($a, $b, $c,             $g; @without_children);
1209        fed4!($a, $b,     $d,         $g; @without_children);
1210        fed4!($a, $b,         $e,     $g; @without_children);
1211        fed4!($a,     $c, $d,         $g; @without_children);
1212        fed4!($a,     $c,     $e,     $g; @without_children);
1213        fed4!($a,         $d, $e,     $g; @without_children);
1214        fed4!(    $b, $c, $d,         $g; @without_children);
1215        fed4!(    $b, $c,     $e,     $g; @without_children);
1216        fed4!(    $b,     $d, $e,     $g; @without_children);
1217        fed4!(        $c, $d, $e,     $g; @without_children);
1218        fed4!($a, $b,             $f, $g; @without_children);
1219        fed4!($a,     $c,         $f, $g; @without_children);
1220        fed4!($a,         $d,     $f, $g; @without_children);
1221        fed4!($a,             $e, $f, $g; @without_children);
1222        fed4!(    $b, $c,         $f, $g; @without_children);
1223        fed4!(    $b,     $d,     $f, $g; @without_children);
1224        fed4!(    $b,         $e, $f, $g; @without_children);
1225        fed4!(        $c, $d,     $f, $g; @without_children);
1226        fed4!(        $c,     $e, $f, $g; @without_children);
1227        fed4!(            $d, $e, $f, $g; @without_children);
1228
1229        fed3!($a, $b, $c;                 @without_children);
1230        fed3!($a, $b,     $d;             @without_children);
1231        fed3!($a, $b,         $e;         @without_children);
1232        fed3!($a,     $c, $d;             @without_children);
1233        fed3!($a,     $c,     $e;         @without_children);
1234        fed3!($a,         $d, $e;         @without_children);
1235        fed3!(    $b, $c, $d;             @without_children);
1236        fed3!(    $b, $c,     $e;         @without_children);
1237        fed3!(    $b,     $d, $e;         @without_children);
1238        fed3!(        $c, $d, $e;         @without_children);
1239        fed3!($a, $b,             $f;     @without_children);
1240        fed3!($a,     $c,         $f;     @without_children);
1241        fed3!($a,         $d,     $f;     @without_children);
1242        fed3!($a,             $e, $f;     @without_children);
1243        fed3!(    $b, $c,         $f;     @without_children);
1244        fed3!(    $b,     $d,     $f;     @without_children);
1245        fed3!(    $b,         $e, $f;     @without_children);
1246        fed3!(        $c, $d,     $f;     @without_children);
1247        fed3!(        $c,     $e, $f;     @without_children);
1248        fed3!(            $d, $e, $f;     @without_children);
1249        //
1250        fed3!($a, $b,                 $g; @without_children);
1251        fed3!($a,     $c,             $g; @without_children);
1252        fed3!($a,         $d,         $g; @without_children);
1253        fed3!($a,             $e,     $g; @without_children);
1254        fed3!($a,                 $f, $g; @without_children);
1255        fed3!(    $b, $c,             $g; @without_children);
1256        fed3!(    $b,     $d,         $g; @without_children);
1257        fed3!(    $b,         $e,     $g; @without_children);
1258        fed3!(    $b,             $f, $g; @without_children);
1259        fed3!(        $c, $d,         $g; @without_children);
1260        fed3!(        $c,     $e,     $g; @without_children);
1261        fed3!(        $c,         $f, $g; @without_children);
1262        fed3!(            $d, $e,     $g; @without_children);
1263        fed3!(            $d,     $f, $g; @without_children);
1264        fed3!(                $e, $f, $g; @without_children);
1265
1266        fed2!($a, $b;                     @without_children);
1267        fed2!($a,     $c;                 @without_children);
1268        fed2!($a,         $d;             @without_children);
1269        fed2!($a,             $e;         @without_children);
1270        fed2!($a,                 $f;     @without_children);
1271        fed2!($a,                     $g; @without_children);
1272        fed2!(    $b, $c;                 @without_children);
1273        fed2!(    $b,     $d;             @without_children);
1274        fed2!(    $b,         $e;         @without_children);
1275        fed2!(    $b,             $f;     @without_children);
1276        fed2!(    $b,                 $g; @without_children);
1277        fed2!(        $c, $d;             @without_children);
1278        fed2!(        $c,     $e;         @without_children);
1279        fed2!(        $c,         $f;     @without_children);
1280        fed2!(        $c,             $g; @without_children);
1281        fed2!(            $d, $e;         @without_children);
1282        fed2!(            $d,     $f;     @without_children);
1283        fed2!(            $d,         $g; @without_children);
1284        fed2!(                $e, $f;     @without_children);
1285        fed2!(                $e,     $g; @without_children);
1286        fed2!(                    $f, $g; @without_children);
1287
1288        fed7!($newtype; $a, $b, $c, $d, $e, $f, $g; @without_children);
1289    };
1290}
1291
1292#[macro_export]
1293macro_rules! fed8 {
1294    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty) => {
1295        fed8!(Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; $a, $b, $c, $d, $e, $f, $g, $h);
1296    };
1297    ($a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty; @without_children) => {
1298        fed8!(Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; $a, $b, $c, $d, $e, $f, $g, $h; @without_children);
1299    };
1300    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty; @without_children) => {
1301        fed8!(Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; generic: Fed8; $a, $b, $c, $d, $e, $f, $g, $h; $a, $b, $c, $d, $e, $f, $g, $h; @without_children);
1302    };
1303    ($newtype:ty; generic: $generic:ident; $($component:ty),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty; @without_children) => {
1304        from_fed!($newtype; $generic; $($component),*; $a, Fed8::T1);
1305        from_fed!($newtype; $generic; $($component),*; $b, Fed8::T2);
1306        from_fed!($newtype; $generic; $($component),*; $c, Fed8::T3);
1307        from_fed!($newtype; $generic; $($component),*; $d, Fed8::T4);
1308        from_fed!($newtype; $generic; $($component),*; $e, Fed8::T5);
1309        from_fed!($newtype; $generic; $($component),*; $f, Fed8::T6);
1310        from_fed!($newtype; $generic; $($component),*; $g, Fed8::T7);
1311        from_fed!($newtype; $generic; $($component),*; $h, Fed8::T8);
1312
1313        fed_traits!($newtype; $generic; $($component),*; $h, Fed8::T8, Fed7, $a => Fed8::T1, $b => Fed8::T2, $c => Fed8::T3, $d => Fed8::T4, $e => Fed8::T5, $f => Fed8::T6, $g => Fed8::T7                );
1314        fed_traits!($newtype; $generic; $($component),*; $g, Fed8::T7, Fed7, $a => Fed8::T1, $b => Fed8::T2, $c => Fed8::T3, $d => Fed8::T4, $e => Fed8::T5, $f => Fed8::T6,                 $h => Fed8::T8);
1315        fed_traits!($newtype; $generic; $($component),*; $f, Fed8::T6, Fed7, $a => Fed8::T1, $b => Fed8::T2, $c => Fed8::T3, $d => Fed8::T4, $e => Fed8::T5,                 $g => Fed8::T7, $h => Fed8::T8);
1316        fed_traits!($newtype; $generic; $($component),*; $e, Fed8::T5, Fed7, $a => Fed8::T1, $b => Fed8::T2, $c => Fed8::T3, $d => Fed8::T4,                 $f => Fed8::T6, $g => Fed8::T7, $h => Fed8::T8);
1317        fed_traits!($newtype; $generic; $($component),*; $d, Fed8::T4, Fed7, $a => Fed8::T1, $b => Fed8::T2, $c => Fed8::T3,                 $e => Fed8::T5, $f => Fed8::T6, $g => Fed8::T7, $h => Fed8::T8);
1318        fed_traits!($newtype; $generic; $($component),*; $c, Fed8::T3, Fed7, $a => Fed8::T1, $b => Fed8::T2,                 $d => Fed8::T4, $e => Fed8::T5, $f => Fed8::T6, $g => Fed8::T7, $h => Fed8::T8);
1319        fed_traits!($newtype; $generic; $($component),*; $b, Fed8::T2, Fed7, $a => Fed8::T1,                 $c => Fed8::T3, $d => Fed8::T4, $e => Fed8::T5, $f => Fed8::T6, $g => Fed8::T7, $h => Fed8::T8);
1320        fed_traits!($newtype; $generic; $($component),*; $a, Fed8::T1, Fed7,                 $b => Fed8::T2, $c => Fed8::T3, $d => Fed8::T4, $e => Fed8::T5, $f => Fed8::T6, $g => Fed8::T7, $h => Fed8::T8);
1321
1322        fed_promotion!(Fed1 => Fed8; <$h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1323        fed_promotion!(Fed1 => Fed8; <$g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1324        fed_promotion!(Fed1 => Fed8; <$f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1325        fed_promotion!(Fed1 => Fed8; <$e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1326        fed_promotion!(Fed1 => Fed8; <$d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1327        fed_promotion!(Fed1 => Fed8; <$c> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$c> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1328        fed_promotion!(Fed1 => Fed8; <$b> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$b> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1329        fed_promotion!(Fed1 => Fed8; <$a> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed1<$a> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed1::T1);
1330
1331
1332        fed_promotion!(Fed2 => Fed8; <$g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1333        fed_promotion!(Fed2 => Fed8; <$f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1334        fed_promotion!(Fed2 => Fed8; <$f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1335        fed_promotion!(Fed2 => Fed8; <$e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1336        fed_promotion!(Fed2 => Fed8; <$e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1337        fed_promotion!(Fed2 => Fed8; <$e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1338        fed_promotion!(Fed2 => Fed8; <$d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1339        fed_promotion!(Fed2 => Fed8; <$d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1340        fed_promotion!(Fed2 => Fed8; <$d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1341        fed_promotion!(Fed2 => Fed8; <$d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1342        fed_promotion!(Fed2 => Fed8; <$c, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$c, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1343        fed_promotion!(Fed2 => Fed8; <$c, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$c, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1344        fed_promotion!(Fed2 => Fed8; <$c, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$c, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1345        fed_promotion!(Fed2 => Fed8; <$c, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$c, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1346        fed_promotion!(Fed2 => Fed8; <$c, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$c, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1347        fed_promotion!(Fed2 => Fed8; <$b, $c> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $c> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1348        fed_promotion!(Fed2 => Fed8; <$b, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1349        fed_promotion!(Fed2 => Fed8; <$b, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1350        fed_promotion!(Fed2 => Fed8; <$b, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1351        fed_promotion!(Fed2 => Fed8; <$b, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1352        fed_promotion!(Fed2 => Fed8; <$b, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$b, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1353        fed_promotion!(Fed2 => Fed8; <$a, $b> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$a, $b> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1354        fed_promotion!(Fed2 => Fed8; <$a, $c> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed2<$a, $c> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed2::T1, Fed2::T2);
1355
1356        fed_promotion!(Fed3 => Fed8; <$f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1357        fed_promotion!(Fed3 => Fed8; <$e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1358        fed_promotion!(Fed3 => Fed8; <$e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1359        fed_promotion!(Fed3 => Fed8; <$e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1360        fed_promotion!(Fed3 => Fed8; <$d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1361        fed_promotion!(Fed3 => Fed8; <$d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1362        fed_promotion!(Fed3 => Fed8; <$d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1363        fed_promotion!(Fed3 => Fed8; <$d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1364        fed_promotion!(Fed3 => Fed8; <$d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1365        fed_promotion!(Fed3 => Fed8; <$d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1366        fed_promotion!(Fed3 => Fed8; <$c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1367        fed_promotion!(Fed3 => Fed8; <$c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1368        fed_promotion!(Fed3 => Fed8; <$c, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1369        fed_promotion!(Fed3 => Fed8; <$c, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1370        fed_promotion!(Fed3 => Fed8; <$c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1371        fed_promotion!(Fed3 => Fed8; <$c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1372        fed_promotion!(Fed3 => Fed8; <$c, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1373        fed_promotion!(Fed3 => Fed8; <$c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1374        fed_promotion!(Fed3 => Fed8; <$c, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1375        fed_promotion!(Fed3 => Fed8; <$c, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$c, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1376        fed_promotion!(Fed3 => Fed8; <$b, $c, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $c, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1377        fed_promotion!(Fed3 => Fed8; <$b, $c, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $c, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1378        fed_promotion!(Fed3 => Fed8; <$b, $c, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $c, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1379        fed_promotion!(Fed3 => Fed8; <$b, $c, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $c, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1380        fed_promotion!(Fed3 => Fed8; <$b, $c, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $c, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1381        fed_promotion!(Fed3 => Fed8; <$b, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1382        fed_promotion!(Fed3 => Fed8; <$b, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1383        fed_promotion!(Fed3 => Fed8; <$b, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1384        fed_promotion!(Fed3 => Fed8; <$b, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1385        fed_promotion!(Fed3 => Fed8; <$b, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1386        fed_promotion!(Fed3 => Fed8; <$b, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1387        fed_promotion!(Fed3 => Fed8; <$b, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1388        fed_promotion!(Fed3 => Fed8; <$b, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1389        fed_promotion!(Fed3 => Fed8; <$b, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1390        fed_promotion!(Fed3 => Fed8; <$b, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$b, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1391        fed_promotion!(Fed3 => Fed8; <$a, $b, $c> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $c> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1392        fed_promotion!(Fed3 => Fed8; <$a, $b, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1393        fed_promotion!(Fed3 => Fed8; <$a, $b, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1394        fed_promotion!(Fed3 => Fed8; <$a, $b, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1395        fed_promotion!(Fed3 => Fed8; <$a, $b, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1396        fed_promotion!(Fed3 => Fed8; <$a, $b, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $b, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1397        fed_promotion!(Fed3 => Fed8; <$a, $c, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $c, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1398        fed_promotion!(Fed3 => Fed8; <$a, $c, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed3<$a, $c, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed3::T1, Fed3::T2, Fed3::T3);
1399
1400        fed_promotion!(Fed4 => Fed8; <$e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1401        fed_promotion!(Fed4 => Fed8; <$d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1402        fed_promotion!(Fed4 => Fed8; <$d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1403        fed_promotion!(Fed4 => Fed8; <$d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1404        fed_promotion!(Fed4 => Fed8; <$d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1405        fed_promotion!(Fed4 => Fed8; <$c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1406        fed_promotion!(Fed4 => Fed8; <$c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1407        fed_promotion!(Fed4 => Fed8; <$c, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1408        fed_promotion!(Fed4 => Fed8; <$c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1409        fed_promotion!(Fed4 => Fed8; <$c, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1410        fed_promotion!(Fed4 => Fed8; <$c, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1411        fed_promotion!(Fed4 => Fed8; <$c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1412        fed_promotion!(Fed4 => Fed8; <$c, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1413        fed_promotion!(Fed4 => Fed8; <$c, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1414        fed_promotion!(Fed4 => Fed8; <$c, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$c, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1415        fed_promotion!(Fed4 => Fed8; <$b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1416        fed_promotion!(Fed4 => Fed8; <$b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1417        fed_promotion!(Fed4 => Fed8; <$b, $c, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1418        fed_promotion!(Fed4 => Fed8; <$b, $c, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1419        fed_promotion!(Fed4 => Fed8; <$b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1420        fed_promotion!(Fed4 => Fed8; <$b, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1421        fed_promotion!(Fed4 => Fed8; <$b, $c, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1422        fed_promotion!(Fed4 => Fed8; <$b, $c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1423        fed_promotion!(Fed4 => Fed8; <$b, $c, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1424        fed_promotion!(Fed4 => Fed8; <$b, $c, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $c, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1425        fed_promotion!(Fed4 => Fed8; <$b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1426        fed_promotion!(Fed4 => Fed8; <$b, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1427        fed_promotion!(Fed4 => Fed8; <$b, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1428        fed_promotion!(Fed4 => Fed8; <$b, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1429        fed_promotion!(Fed4 => Fed8; <$b, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1430        fed_promotion!(Fed4 => Fed8; <$b, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1431        fed_promotion!(Fed4 => Fed8; <$b, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1432        fed_promotion!(Fed4 => Fed8; <$b, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1433        fed_promotion!(Fed4 => Fed8; <$b, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1434        fed_promotion!(Fed4 => Fed8; <$b, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$b, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1435        fed_promotion!(Fed4 => Fed8; <$a, $b, $c, $d> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $c, $d> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1436        fed_promotion!(Fed4 => Fed8; <$a, $b, $c, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $c, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1437        fed_promotion!(Fed4 => Fed8; <$a, $b, $c, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $c, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1438        fed_promotion!(Fed4 => Fed8; <$a, $b, $c, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $c, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1439        fed_promotion!(Fed4 => Fed8; <$a, $b, $c, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $c, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1440        fed_promotion!(Fed4 => Fed8; <$a, $b, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1441        fed_promotion!(Fed4 => Fed8; <$a, $b, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1442        fed_promotion!(Fed4 => Fed8; <$a, $b, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1443        fed_promotion!(Fed4 => Fed8; <$a, $b, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1444        fed_promotion!(Fed4 => Fed8; <$a, $b, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1445        fed_promotion!(Fed4 => Fed8; <$a, $b, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1446        fed_promotion!(Fed4 => Fed8; <$a, $b, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1447        fed_promotion!(Fed4 => Fed8; <$a, $b, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1448        fed_promotion!(Fed4 => Fed8; <$a, $b, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1449        fed_promotion!(Fed4 => Fed8; <$a, $b, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $b, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1450        fed_promotion!(Fed4 => Fed8; <$a, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1451        fed_promotion!(Fed4 => Fed8; <$a, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1452        fed_promotion!(Fed4 => Fed8; <$a, $c, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1453        fed_promotion!(Fed4 => Fed8; <$a, $c, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1454        fed_promotion!(Fed4 => Fed8; <$a, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1455        fed_promotion!(Fed4 => Fed8; <$a, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed4<$a, $c, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed4::T1, Fed4::T2, Fed4::T3, Fed4::T4);
1456
1457        fed_promotion!(Fed5 => Fed8; <$d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1458        fed_promotion!(Fed5 => Fed8; <$c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$c, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1459        fed_promotion!(Fed5 => Fed8; <$c, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$c, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1460        fed_promotion!(Fed5 => Fed8; <$c, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$c, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1461        fed_promotion!(Fed5 => Fed8; <$c, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$c, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1462        fed_promotion!(Fed5 => Fed8; <$c, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$c, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1463        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1464        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1465        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1466        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1467        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1468        fed_promotion!(Fed5 => Fed8; <$b, $c, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1469        fed_promotion!(Fed5 => Fed8; <$b, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1470        fed_promotion!(Fed5 => Fed8; <$b, $c, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1471        fed_promotion!(Fed5 => Fed8; <$b, $c, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1472        fed_promotion!(Fed5 => Fed8; <$b, $c, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $c, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1473        fed_promotion!(Fed5 => Fed8; <$b, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1474        fed_promotion!(Fed5 => Fed8; <$b, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1475        fed_promotion!(Fed5 => Fed8; <$b, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1476        fed_promotion!(Fed5 => Fed8; <$b, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1477        fed_promotion!(Fed5 => Fed8; <$b, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$b, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1478        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $d, $e> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $d, $e> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1479        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $d, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $d, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1480        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $d, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $d, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1481        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $d, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $d, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1482        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1483        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1484        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1485        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1486        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1487        fed_promotion!(Fed5 => Fed8; <$a, $b, $c, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $c, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1488        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1489        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1490        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1491        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1492        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1493        fed_promotion!(Fed5 => Fed8; <$a, $b, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1494        fed_promotion!(Fed5 => Fed8; <$a, $b, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1495        fed_promotion!(Fed5 => Fed8; <$a, $b, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1496        fed_promotion!(Fed5 => Fed8; <$a, $b, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1497        fed_promotion!(Fed5 => Fed8; <$a, $b, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $b, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1498        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1499        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1500        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1501        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1502        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1503        fed_promotion!(Fed5 => Fed8; <$a, $c, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1504        fed_promotion!(Fed5 => Fed8; <$a, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1505        fed_promotion!(Fed5 => Fed8; <$a, $c, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1506        fed_promotion!(Fed5 => Fed8; <$a, $c, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed5<$a, $c, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed5::T1, Fed5::T2, Fed5::T3, Fed5::T4, Fed5::T5);
1507
1508        fed_promotion!(Fed6 => Fed8; <$c, $d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$c, $d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1509        fed_promotion!(Fed6 => Fed8; <$b, $c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $c, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1510        fed_promotion!(Fed6 => Fed8; <$b, $c, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $c, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1511        fed_promotion!(Fed6 => Fed8; <$b, $c, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $c, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1512        fed_promotion!(Fed6 => Fed8; <$b, $c, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $c, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1513        fed_promotion!(Fed6 => Fed8; <$b, $c, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $c, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1514        fed_promotion!(Fed6 => Fed8; <$b, $d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$b, $d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1515        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $e, $f> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $e, $f> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1516        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $e, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $e, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1517        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $e, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $e, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1518        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1519        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1520        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $d, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $d, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1521        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1522        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1523        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1524        fed_promotion!(Fed6 => Fed8; <$a, $b, $c, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $c, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1525        fed_promotion!(Fed6 => Fed8; <$a, $b, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1526        fed_promotion!(Fed6 => Fed8; <$a, $b, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1527        fed_promotion!(Fed6 => Fed8; <$a, $b, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1528        fed_promotion!(Fed6 => Fed8; <$a, $b, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1529        fed_promotion!(Fed6 => Fed8; <$a, $b, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $b, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1530        fed_promotion!(Fed6 => Fed8; <$a, $c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $c, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1531        fed_promotion!(Fed6 => Fed8; <$a, $c, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $c, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1532        fed_promotion!(Fed6 => Fed8; <$a, $c, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $c, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1533        fed_promotion!(Fed6 => Fed8; <$a, $c, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $c, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1534        fed_promotion!(Fed6 => Fed8; <$a, $c, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed6<$a, $c, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed6::T1, Fed6::T2, Fed6::T3, Fed6::T4, Fed6::T5, Fed6::T6);
1535
1536        fed_promotion!(Fed7 => Fed8; <$b, $c, $d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$b, $c, $d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1537        fed_promotion!(Fed7 => Fed8; <$a, $b, $c, $d, $e, $f, $g> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $c, $d, $e, $f, $g> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1538        fed_promotion!(Fed7 => Fed8; <$a, $b, $c, $d, $e, $f, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $c, $d, $e, $f, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1539        fed_promotion!(Fed7 => Fed8; <$a, $b, $c, $d, $e, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $c, $d, $e, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1540        fed_promotion!(Fed7 => Fed8; <$a, $b, $c, $d, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $c, $d, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1541        fed_promotion!(Fed7 => Fed8; <$a, $b, $c, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $c, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1542        fed_promotion!(Fed7 => Fed8; <$a, $b, $d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $b, $d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1543        fed_promotion!(Fed7 => Fed8; <$a, $c, $d, $e, $f, $g, $h> => <$a, $b, $c, $d, $e, $f, $g, $h>; Fed7<$a, $c, $d, $e, $f, $g, $h> => Fed8<$a, $b, $c, $d, $e, $f, $g, $h>; Fed7::T1, Fed7::T2, Fed7::T3, Fed7::T4, Fed7::T5, Fed7::T6, Fed7::T7);
1544
1545    };
1546    ($newtype:ty; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty, $g:ty, $h:ty) => {
1547        fed7!($a, $b, $c, $d, $e, $f, $g;     @without_children);
1548        fed7!($a, $b, $c, $d, $e, $f,     $h; @without_children);
1549        fed7!($a, $b, $c, $d, $e,     $g, $h; @without_children);
1550        fed7!($a, $b, $c, $d,     $f, $g, $h; @without_children);
1551        fed7!($a, $b, $c,     $e, $f, $g, $h; @without_children);
1552        fed7!($a, $b,     $d, $e, $f, $g, $h; @without_children);
1553        fed7!($a,     $c, $d, $e, $f, $g, $h; @without_children);
1554        fed7!(    $b, $c, $d, $e, $f, $g, $h; @without_children);
1555
1556        fed6!($a, $b, $c, $d, $e, $f;         @without_children);
1557        fed6!($a, $b, $c, $d, $e,     $g;     @without_children);
1558        fed6!($a, $b, $c, $d,     $f, $g;     @without_children);
1559        fed6!($a, $b, $c,     $e, $f, $g;     @without_children);
1560        fed6!($a, $b,     $d, $e, $f, $g;     @without_children);
1561        fed6!($a,     $c, $d, $e, $f, $g;     @without_children);
1562        fed6!(    $b, $c, $d, $e, $f, $g;     @without_children);
1563        fed6!($a, $b, $c, $d, $e,         $h; @without_children);
1564        fed6!($a, $b, $c, $d,     $f,     $h; @without_children);
1565        fed6!($a, $b, $c,     $e, $f,     $h; @without_children);
1566        fed6!($a, $b,     $d, $e, $f,     $h; @without_children);
1567        fed6!($a,     $c, $d, $e, $f,     $h; @without_children);
1568        fed6!(    $b, $c, $d, $e, $f,     $h; @without_children);
1569        fed6!($a, $b, $c, $d,         $g, $h; @without_children);
1570        fed6!($a, $b, $c,     $e,     $g, $h; @without_children);
1571        fed6!($a, $b, $c,         $f, $g, $h; @without_children);
1572        fed6!($a, $b,     $d, $e,     $g, $h; @without_children);
1573        fed6!($a, $b,     $d,     $f, $g, $h; @without_children);
1574        fed6!($a, $b,         $e, $f, $g, $h; @without_children);
1575        fed6!($a,     $c, $d, $e,     $g, $h; @without_children);
1576        fed6!($a,     $c, $d,     $f, $g, $h; @without_children);
1577        fed6!($a,     $c,     $e, $f, $g, $h; @without_children);
1578        fed6!($a,         $d, $e, $f, $g, $h; @without_children);
1579        fed6!(    $b, $c, $d, $e,     $g, $h; @without_children);
1580        fed6!(    $b, $c, $d,     $f, $g, $h; @without_children);
1581        fed6!(    $b, $c,     $e, $f, $g, $h; @without_children);
1582        fed6!(    $b,     $d, $e, $f, $g, $h; @without_children);
1583        fed6!(        $c, $d, $e, $f, $g, $h; @without_children);
1584
1585        fed5!($a, $b, $c, $d, $e;             @without_children);
1586        fed5!($a, $b, $c, $d,     $f;         @without_children);
1587        fed5!($a, $b, $c,     $e, $f;         @without_children);
1588        fed5!($a, $b,     $d, $e, $f;         @without_children);
1589        fed5!($a,     $c, $d, $e, $f;         @without_children);
1590        fed5!(    $b, $c, $d, $e, $f;         @without_children);
1591        fed5!($a, $b, $c, $d,         $g;     @without_children);
1592        fed5!($a, $b, $c,     $e,     $g;     @without_children);
1593        fed5!($a, $b, $c,         $f, $g;     @without_children);
1594        fed5!($a, $b,     $d, $e,     $g;     @without_children);
1595        fed5!($a, $b,     $d,     $f, $g;     @without_children);
1596        fed5!($a, $b,         $e, $f, $g;     @without_children);
1597        fed5!($a,     $c, $d, $e,     $g;     @without_children);
1598        fed5!($a,     $c, $d,     $f, $g;     @without_children);
1599        fed5!($a,     $c,     $e, $f, $g;     @without_children);
1600        fed5!($a,         $d, $e, $f, $g;     @without_children);
1601        fed5!(    $b, $c, $d, $e,     $g;     @without_children);
1602        fed5!(    $b, $c, $d,     $f, $g;     @without_children);
1603        fed5!(    $b, $c,     $e, $f, $g;     @without_children);
1604        fed5!(    $b,     $d, $e, $f, $g;     @without_children);
1605        fed5!(        $c, $d, $e, $f, $g;     @without_children);
1606        fed5!($a, $b, $c, $d,             $h; @without_children);
1607        fed5!($a, $b, $c,     $e,         $h; @without_children);
1608        fed5!($a, $b, $c,         $f,     $h; @without_children);
1609        fed5!($a, $b,     $d, $e,         $h; @without_children);
1610        fed5!($a, $b,     $d,     $f,     $h; @without_children);
1611        fed5!($a, $b,         $e, $f,     $h; @without_children);
1612        fed5!($a,     $c, $d, $e,         $h; @without_children);
1613        fed5!($a,     $c, $d,     $f,     $h; @without_children);
1614        fed5!($a,     $c,     $e, $f,     $h; @without_children);
1615        fed5!($a,         $d, $e, $f,     $h; @without_children);
1616        fed5!(    $b, $c, $d, $e,         $h; @without_children);
1617        fed5!(    $b, $c, $d,     $f,     $h; @without_children);
1618        fed5!(    $b, $c,     $e, $f,     $h; @without_children);
1619        fed5!(    $b,     $d, $e, $f,     $h; @without_children);
1620        fed5!(        $c, $d, $e, $f,     $h; @without_children);
1621        fed5!($a, $b, $c,             $g, $h; @without_children);
1622        fed5!($a, $b,     $d,         $g, $h; @without_children);
1623        fed5!($a, $b,         $e,     $g, $h; @without_children);
1624        fed5!($a,     $c, $d,         $g, $h; @without_children);
1625        fed5!($a,     $c,     $e,     $g, $h; @without_children);
1626        fed5!($a,         $d, $e,     $g, $h; @without_children);
1627        fed5!(    $b, $c, $d,         $g, $h; @without_children);
1628        fed5!(    $b, $c,     $e,     $g, $h; @without_children);
1629        fed5!(    $b,     $d, $e,     $g, $h; @without_children);
1630        fed5!(        $c, $d, $e,     $g, $h; @without_children);
1631        fed5!($a, $b,             $f, $g, $h; @without_children);
1632        fed5!($a,     $c,         $f, $g, $h; @without_children);
1633        fed5!($a,         $d,     $f, $g, $h; @without_children);
1634        fed5!($a,             $e, $f, $g, $h; @without_children);
1635        fed5!(    $b, $c,         $f, $g, $h; @without_children);
1636        fed5!(    $b,     $d,     $f, $g, $h; @without_children);
1637        fed5!(    $b,         $e, $f, $g, $h; @without_children);
1638        fed5!(        $c, $d,     $f, $g, $h; @without_children);
1639        fed5!(        $c,     $e, $f, $g, $h; @without_children);
1640        fed5!(            $d, $e, $f, $g, $h; @without_children);
1641
1642        fed4!($a, $b, $c, $d;                 @without_children);
1643        fed4!($a, $b, $c,     $e;             @without_children);
1644        fed4!($a, $b, $c,         $f;         @without_children);
1645        fed4!($a, $b,     $d, $e;             @without_children);
1646        fed4!($a, $b,     $d,     $f;         @without_children);
1647        fed4!($a, $b,         $e, $f;         @without_children);
1648        fed4!($a,     $c, $d, $e;             @without_children);
1649        fed4!($a,     $c, $d,     $f;         @without_children);
1650        fed4!($a,     $c,     $e, $f;         @without_children);
1651        fed4!($a,         $d, $e, $f;         @without_children);
1652        fed4!(    $b, $c, $d, $e;             @without_children);
1653        fed4!(    $b, $c, $d,     $f;         @without_children);
1654        fed4!(    $b, $c,     $e, $f;         @without_children);
1655        fed4!(    $b,     $d, $e, $f;         @without_children);
1656        fed4!(        $c, $d, $e, $f;         @without_children);
1657        fed4!($a, $b, $c,             $g;     @without_children);
1658        fed4!($a, $b,     $d,         $g;     @without_children);
1659        fed4!($a, $b,         $e,     $g;     @without_children);
1660        fed4!($a,     $c, $d,         $g;     @without_children);
1661        fed4!($a,     $c,     $e,     $g;     @without_children);
1662        fed4!($a,         $d, $e,     $g;     @without_children);
1663        fed4!(    $b, $c, $d,         $g;     @without_children);
1664        fed4!(    $b, $c,     $e,     $g;     @without_children);
1665        fed4!(    $b,     $d, $e,     $g;     @without_children);
1666        fed4!(        $c, $d, $e,     $g;     @without_children);
1667        fed4!($a, $b,             $f, $g;     @without_children);
1668        fed4!($a,     $c,         $f, $g;     @without_children);
1669        fed4!($a,         $d,     $f, $g;     @without_children);
1670        fed4!($a,             $e, $f, $g;     @without_children);
1671        fed4!(    $b, $c,         $f, $g;     @without_children);
1672        fed4!(    $b,     $d,     $f, $g;     @without_children);
1673        fed4!(    $b,         $e, $f, $g;     @without_children);
1674        fed4!(        $c, $d,     $f, $g;     @without_children);
1675        fed4!(        $c,     $e, $f, $g;     @without_children);
1676        fed4!(            $d, $e, $f, $g;     @without_children);
1677        fed4!($a, $b, $c,                 $h; @without_children);
1678        fed4!($a, $b,     $d,             $h; @without_children);
1679        fed4!($a, $b,         $e,         $h; @without_children);
1680        fed4!($a,     $c, $d,             $h; @without_children);
1681        fed4!($a,     $c,     $e,         $h; @without_children);
1682        fed4!($a,         $d, $e,         $h; @without_children);
1683        fed4!(    $b, $c, $d,             $h; @without_children);
1684        fed4!(    $b, $c,     $e,         $h; @without_children);
1685        fed4!(    $b,     $d, $e,         $h; @without_children);
1686        fed4!(        $c, $d, $e,         $h; @without_children);
1687        fed4!($a, $b,             $f,     $h; @without_children);
1688        fed4!($a,     $c,         $f,     $h; @without_children);
1689        fed4!($a,         $d,     $f,     $h; @without_children);
1690        fed4!($a,             $e, $f,     $h; @without_children);
1691        fed4!(    $b, $c,         $f,     $h; @without_children);
1692        fed4!(    $b,     $d,     $f,     $h; @without_children);
1693        fed4!(    $b,         $e, $f,     $h; @without_children);
1694        fed4!(        $c, $d,     $f,     $h; @without_children);
1695        fed4!(        $c,     $e, $f,     $h; @without_children);
1696        fed4!(            $d, $e, $f,     $h; @without_children);
1697        fed4!($a, $b,                 $g, $h; @without_children);
1698        fed4!($a,     $c,             $g, $h; @without_children);
1699        fed4!($a,         $d,         $g, $h; @without_children);
1700        fed4!($a,             $e,     $g, $h; @without_children);
1701        fed4!($a,                 $f, $g, $h; @without_children);
1702        fed4!(    $b, $c,             $g, $h; @without_children);
1703        fed4!(    $b,     $d,         $g, $h; @without_children);
1704        fed4!(    $b,         $e,     $g, $h; @without_children);
1705        fed4!(    $b,             $f, $g, $h; @without_children);
1706        fed4!(        $c, $d,         $g, $h; @without_children);
1707        fed4!(        $c,     $e,     $g, $h; @without_children);
1708        fed4!(        $c,         $f, $g, $h; @without_children);
1709        fed4!(            $d, $e,     $g, $h; @without_children);
1710        fed4!(            $d,     $f, $g, $h; @without_children);
1711        fed4!(                $e, $f, $g, $h; @without_children);
1712
1713        fed3!($a, $b, $c;                     @without_children);
1714        fed3!($a, $b,     $d;                 @without_children);
1715        fed3!($a, $b,         $e;             @without_children);
1716        fed3!($a,     $c, $d;                 @without_children);
1717        fed3!($a,     $c,     $e;             @without_children);
1718        fed3!($a,         $d, $e;             @without_children);
1719        fed3!(    $b, $c, $d;                 @without_children);
1720        fed3!(    $b, $c,     $e;             @without_children);
1721        fed3!(    $b,     $d, $e;             @without_children);
1722        fed3!(        $c, $d, $e;             @without_children);
1723        fed3!($a, $b,             $f;         @without_children);
1724        fed3!($a,     $c,         $f;         @without_children);
1725        fed3!($a,         $d,     $f;         @without_children);
1726        fed3!($a,             $e, $f;         @without_children);
1727        fed3!(    $b, $c,         $f;         @without_children);
1728        fed3!(    $b,     $d,     $f;         @without_children);
1729        fed3!(    $b,         $e, $f;         @without_children);
1730        fed3!(        $c, $d,     $f;         @without_children);
1731        fed3!(        $c,     $e, $f;         @without_children);
1732        fed3!(            $d, $e, $f;         @without_children);
1733        fed3!($a, $b,                 $g;     @without_children);
1734        fed3!($a,     $c,             $g;     @without_children);
1735        fed3!($a,         $d,         $g;     @without_children);
1736        fed3!($a,             $e,     $g;     @without_children);
1737        fed3!($a,                 $f, $g;     @without_children);
1738        fed3!(    $b, $c,             $g;     @without_children);
1739        fed3!(    $b,     $d,         $g;     @without_children);
1740        fed3!(    $b,         $e,     $g;     @without_children);
1741        fed3!(    $b,             $f, $g;     @without_children);
1742        fed3!(        $c, $d,         $g;     @without_children);
1743        fed3!(        $c,     $e,     $g;     @without_children);
1744        fed3!(        $c,         $f, $g;     @without_children);
1745        fed3!(            $d, $e,     $g;     @without_children);
1746        fed3!(            $d,     $f, $g;     @without_children);
1747        fed3!(                $e, $f, $g;     @without_children);
1748        fed3!($a, $b,                     $h; @without_children);
1749        fed3!($a,     $c,                 $h; @without_children);
1750        fed3!($a,         $d,             $h; @without_children);
1751        fed3!($a,             $e,         $h; @without_children);
1752        fed3!($a,                 $f,     $h; @without_children);
1753        fed3!($a,                     $g, $h; @without_children);
1754        fed3!(    $b, $c,                 $h; @without_children);
1755        fed3!(    $b,     $d,             $h; @without_children);
1756        fed3!(    $b,         $e,         $h; @without_children);
1757        fed3!(    $b,             $f,     $h; @without_children);
1758        fed3!(    $b,                 $g, $h; @without_children);
1759        fed3!(        $c, $d,             $h; @without_children);
1760        fed3!(        $c,     $e,         $h; @without_children);
1761        fed3!(        $c,         $f,     $h; @without_children);
1762        fed3!(        $c,             $g, $h; @without_children);
1763        fed3!(            $d, $e,         $h; @without_children);
1764        fed3!(            $d,     $f,     $h; @without_children);
1765        fed3!(            $d,         $g, $h; @without_children);
1766        fed3!(                $e, $f,     $h; @without_children);
1767        fed3!(                $e,     $g, $h; @without_children);
1768        fed3!(                    $f, $g, $h; @without_children);
1769
1770        fed2!($a, $b;                         @without_children);
1771        fed2!($a,     $c;                     @without_children);
1772        fed2!($a,         $d;                 @without_children);
1773        fed2!($a,             $e;             @without_children);
1774        fed2!($a,                 $f;         @without_children);
1775        fed2!($a,                     $g;     @without_children);
1776        fed2!($a,                         $h; @without_children);
1777        fed2!(    $b, $c;                     @without_children);
1778        fed2!(    $b,     $d;                 @without_children);
1779        fed2!(    $b,         $e;             @without_children);
1780        fed2!(    $b,             $f;         @without_children);
1781        fed2!(    $b,                 $g;     @without_children);
1782        fed2!(    $b,                     $h; @without_children);
1783        fed2!(        $c, $d;                 @without_children);
1784        fed2!(        $c,     $e;             @without_children);
1785        fed2!(        $c,         $f;         @without_children);
1786        fed2!(        $c,             $g;     @without_children);
1787        fed2!(        $c,                 $h; @without_children);
1788        fed2!(            $d, $e;             @without_children);
1789        fed2!(            $d,     $f;         @without_children);
1790        fed2!(            $d,         $g;     @without_children);
1791        fed2!(            $d,             $h; @without_children);
1792        fed2!(                $e, $f;         @without_children);
1793        fed2!(                $e,     $g;     @without_children);
1794        fed2!(                $e,         $h; @without_children);
1795        fed2!(                    $f, $g;     @without_children);
1796        fed2!(                    $f,     $h; @without_children);
1797        fed2!(                        $g, $h; @without_children);
1798
1799        fed8!($newtype; $a, $b, $c, $d, $e, $f, $g, $h; @without_children);
1800    };
1801}
1802
1803/// Moar examples that don't actually work
1804/// ```rust,ignore
1805///     fn dumb_thing_3(b: Fed2<B1, B7>) {
1806///         let message = String::from("It's a ") + match b {
1807///             _: B1 => "B1",
1808///             _: B2 => "B2",
1809///         } + "!";
1810///
1811///         println!("{}", message);
1812///     }
1813/// ```
1814///
1815/// ```rust,ignore
1816///     fn dumb_thing_4(b: Fed2<bool, Option<u8>>) {
1817///         let debugged = match b {
1818///             Some(0) |
1819///             None    |
1820///             false   => "nothing",
1821///
1822///             Some(1) |
1823///             true    => "one-an-only",
1824///
1825///             Some(_) => "many",
1826///         };
1827///
1828///         println!("It's a {}.", debugged);
1829///     }
1830/// ```
1831///
1832/// ```rust,ignore
1833///     fn dumb_thing_5(b: Fed2<bool, Option<bool>>) {
1834///         let result = match b {
1835///             Some(condition) |
1836///             condition: bool => condition,
1837///
1838///             None => false,
1839///         };
1840///
1841///         println!("It's {:?}.", result);
1842///     }
1843/// ```
1844///
1845/// ```rust,ignore
1846///     fn dumb_thing_6(b: Fed2<u8, i8>) {
1847///         let Ok(magnitude) = b.map(|i: i8| i.abs() as u8).extract::<u8>();
1848///
1849///         println!("It's {:?}.", magnitude);
1850///     }
1851/// ```
1852///
1853/// ```rust,ignore
1854///     fn dumb_thing_7(b: Fed2<u8, i8>) {
1855///         let Ok(is_non_negative) = b.map(|_: u8| true)
1856///             .map(|i: i8| i > 0)
1857///             .extract::<bool>();
1858///
1859///         println!("Claim: It is non-negative... {:?}.", non_negative);
1860///     }
1861/// ```
1862///
1863/// ```rust,ignore
1864///     fn dumb_thing_8(b: (bool, u8)) -> Fed2<u8, i16> {
1865///         match b {
1866///             (true, i) => ((i as i16) * -1).into(),
1867///             (false, i) => i.into(),
1868///         }
1869///     }
1870/// ```
1871
1872#[cfg(test)]
1873mod test {
1874    init_fed!();
1875    use self::fed::*;
1876
1877    macro_rules! fed_vec {
1878        ($($element:expr),*,) => { vec![
1879            $( ($element).into()),*
1880        ] };
1881    }
1882
1883    fed!(
1884        String,
1885        Vec<bool>,
1886        bool,
1887        i64,
1888        u8
1889    );
1890
1891    fed!(
1892        (),
1893        Vec<Vec<()>>,
1894        char,
1895        f32,
1896        f64
1897    );
1898
1899    #[test]
1900    fn test_map_all() {
1901        let var: Fed1<String> = String::from("abc").into();
1902        assert_eq!(
1903            var.map_all(
1904                |string: String| string.contains('b')
1905            ),
1906            true
1907        );
1908
1909        let var: Fed3<String, bool, u8> = String::from("abc").into();
1910        assert_eq!(
1911            var.map_all(
1912                |string:  String| string.contains('b'),
1913                |boolean: bool|   boolean,
1914                |_:       u8|     false,
1915            ),
1916            true
1917        );
1918
1919        let var: Fed3<String, bool, u8> = String::from("abc").into();
1920        let var: Fed2<bool, u8> = var.map_all(
1921            |string:  String| string.contains('b').into(),
1922            |boolean: bool  | boolean.into(),
1923            |num:     u8    | num.into(),
1924        );
1925        assert_eq!(var, true.into());
1926    }
1927
1928    #[test]
1929    fn test_as_ref() {
1930        let val: Fed3<String, bool, u8> = String::from("abc").into();
1931        assert_eq!(val.as_ref(), (&String::from("abc")).into());
1932    }
1933
1934    #[test]
1935    fn tester() {
1936        let vec: Vec<Fed3<bool, i64, u8>> = vec![
1937            false.into(),
1938            27_i64.into(),
1939            0_i64.into(),
1940            b'A'.into(),
1941        ];
1942
1943        assert_eq!(vec.iter().filter(Fed::is::<i64>).count(), 2);
1944        assert_eq!(vec[3].extract::<u8>(), Ok(b'A'));
1945    }
1946
1947    #[test]
1948    fn fed3() {
1949        let element: Fed3<String, bool, u8> = 8u8.into();
1950        let element = element.map_same(|element: u8| element + 83);
1951        assert!(element.is::<u8>());
1952        assert_eq!(element, (8u8 + 83).into());
1953        assert!(!element.is::<String>());
1954
1955        let element: Fed3<String, bool, u8> = String::from("abc").into();
1956        let element = element.map_same(|element: u8| element + 83);
1957        assert!(!element.is::<u8>());
1958        assert_eq!(element, String::from("abc").into());
1959        assert!(element.is::<String>());
1960
1961        let element = match element.extract::<String>() {
1962            ::std::result::Result::Ok(el) => el,
1963            ::std::result::Result::Err(_) => loop {},
1964        };
1965
1966        assert_eq!(element, String::from("abc"));
1967
1968        let vec: Vec<Fed3<String, bool, u8>> = vec!(8u8.into(), false.into());
1969        assert_eq!(vec.iter().filter(Fed::is::<u8>).count(), 1);
1970        assert_eq!(vec.last(), Some(&false.into()));
1971    }
1972
1973    #[test]
1974    fn fed1() {
1975        let element: Fed1<_> = 3u8.into();
1976        let element = element.extract::<u8>().ok().unwrap();
1977        // If Rust fully understood the 'never' type, we might be able to do this instead:
1978        // let ::std::result::Result::Ok(element) = element.extract::<u8>();
1979        assert_eq!(element, 3u8);
1980    }
1981
1982    #[derive(Copy, Clone, Debug, PartialEq)]
1983    struct B1;
1984
1985    #[derive(Copy, Clone, Debug, PartialEq)]
1986    struct B2;
1987
1988    #[derive(Copy, Clone, Debug, PartialEq)]
1989    struct B3;
1990
1991    #[derive(Copy, Clone, Debug, PartialEq)]
1992    struct B4;
1993
1994    fed!(
1995        B1,
1996        B2,
1997        B3,
1998        B4,
1999    );
2000
2001    fn dumb_thing_1(b: Fed2<B1, B3>) -> bool {
2002        b.is::<B1>()
2003    }
2004
2005    #[test]
2006    fn try_dumb_thing_1() {
2007        assert!(dumb_thing_1(B1.into()));
2008        assert!(!dumb_thing_1(B3.into()));
2009    }
2010
2011    fn dumb_thing_2<T: Into<Fed2<B1, B3>>>(b: T) -> bool {
2012        Fed2::<B1, B3>::is::<B1>(&b.into())
2013    }
2014
2015    #[test]
2016    fn try_dumb_thing_2() {
2017        assert!(dumb_thing_2(B1));
2018        assert!(!dumb_thing_2(B3));
2019    }
2020
2021    fn dumb_thing_3<T: Into<Fed2<B1, B3>>>(b: T) -> Fed2<B1, B3> {
2022        b.into()
2023    }
2024
2025    #[test]
2026    fn try_dumb_thing_3() {
2027        let vec: Vec<Fed3<B1, B2, B3>> = vec![
2028            dumb_thing_3(B3).into(),
2029            dumb_thing_3(B1).into(),
2030            dumb_thing_3(B1).into(),
2031            B3.into(),
2032            Fed1::<B1>::from(B1).into(),
2033        ];
2034
2035        assert_eq!(vec.iter().filter(Fed::is::<B1>).count(), 3);
2036        assert_eq!(vec.iter().filter(Fed::is::<B2>).count(), 0);
2037        assert_eq!(vec.iter().filter(Fed::is::<B3>).count(), 2);
2038
2039        let vec2 = fed_vec![
2040            dumb_thing_3(B3),
2041            dumb_thing_3(B1),
2042            dumb_thing_3(B1),
2043            B3,
2044            Fed1::from(B1),
2045        ];
2046
2047        assert_eq!(vec, vec2);
2048    }
2049
2050    #[test]
2051    fn test_map_all2() {
2052        let var: Fed4<B1, B2, B3, B4> = B2.into();
2053
2054        assert_eq!(var, B2.into());
2055
2056        let mapped: Fed2<B1, B3> = var.map_all(
2057            |b: B1| b.into(),
2058            |_: B2| B3.into(),
2059            |b: B3| b.into(),
2060            |_: B4| B3.into(),
2061        );
2062        assert_eq!(mapped, B3.into());
2063
2064        let var2: Fed3<B1, B2, B4> = B2.into();
2065        assert_eq!(var, var2.into());
2066    }
2067
2068    #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2069    struct Nothing;
2070
2071    type Maybe<T> = Fed2<T, Nothing>;
2072
2073    fed!(bool, Nothing);
2074    fed!(String, Nothing);
2075    fed!(u8, Nothing);
2076
2077    trait MaybeConstraint<T>: From<T> + From<Nothing> {}
2078    impl<T> MaybeConstraint<T> for Maybe<T> where Maybe<T>: From<T> + From<Nothing> {}
2079
2080    impl<T> Default for Maybe<T>
2081    where Self: MaybeConstraint<T>
2082    {
2083        fn default() -> Self {
2084            Nothing.into()
2085        }
2086    }
2087
2088
2089    impl<T> Maybe<T>
2090    where Self: MaybeConstraint<T>
2091    {
2092        pub fn map<U, F>(self, verb: F) -> Maybe<U>
2093        where
2094            Maybe<U>: MaybeConstraint<U>,
2095            F: FnOnce(T) -> U,
2096        {
2097            self.map_all(
2098                |some: T| verb(some).into(),
2099                |_|       Nothing.into(),
2100            )
2101        }
2102
2103        pub fn unwrap(self) -> T {
2104            self.map_all(
2105                |t| t,
2106                |_: Nothing| panic!("called `Maybe<_>::unwrap()` on a `Nothing` value"),
2107            )
2108        }
2109    }
2110
2111    impl<T> Into<Option<T>> for Maybe<T>
2112    where Self: MaybeConstraint<T>
2113    {
2114        fn into(self) -> Option<T> {
2115            self.map_all(Some, |_| None)
2116        }
2117    }
2118
2119    #[test]
2120    fn fake_option() {
2121        let options: Vec<Maybe<_>> = fed_vec![
2122            Nothing,
2123            true,
2124            false,
2125        ];
2126
2127        let options2: Vec<_> = options.iter().cloned()
2128            .map(|option| {
2129                option.map(|boolean| boolean.to_string())
2130            }).collect();
2131
2132        let options3: Vec<Maybe<_>> = fed_vec![
2133            Nothing,
2134            String::from("true"),
2135            String::from("false"),
2136        ];
2137
2138        assert_eq!(options2, options3);
2139
2140        let maybe_num: Maybe<_> = 33.into();
2141        assert_eq!(maybe_num, 33.into());
2142        assert_eq!(maybe_num.unwrap(), 33);
2143    }
2144
2145    // Wrapping ValueT in a newtype struct breaks the cyclic reference so that
2146    // we can make a recursive type.
2147    pub struct Value(pub ValueT);
2148    type ValueT = Fed3<i32, String, Array>;
2149    type Array = Vec<Value>;
2150    fed!(
2151        i32,
2152        String,
2153        Array,
2154    );
2155
2156    use ::std::ops::Deref;
2157    impl Deref for Value {
2158        type Target = ValueT;
2159
2160        fn deref(&self) -> &Self::Target {
2161            &self.0
2162        }
2163    }
2164
2165    impl From<ValueT> for Value {
2166        fn from(value: ValueT) -> Self {
2167            Value(value)
2168        }
2169    }
2170
2171    #[test]
2172    fn recursive() {
2173        let value = Value(123.into());
2174
2175        assert!((*value).is::<i32>());
2176    }
2177
2178    macro_rules! array {
2179        ($($item:expr,)*) => {
2180            vec![$(Value($item.into()),)*]
2181        };
2182        ($($item:expr),*) => { array![$($item,)*] };
2183    }
2184
2185    #[test]
2186    fn recursive2() {
2187        let ary = array![
2188            32,
2189            String::from("abc"),
2190            array![1, 2, 3],
2191            74,
2192        ];
2193
2194        // TODO Should consider implementing `Fed` for types that deref to
2195        // types that implement `Is_<_>` to avoid having to call `deref`
2196        // explicitly here
2197        assert!(ary[0].deref().is::<i32>());
2198        assert_eq!(ary[1].as_ref().extract::<&String>().ok().unwrap(), "abc");
2199        // TODO Should consider implementing an `extract_ref` method that
2200        // combines `as_ref` with `extract`... May end up being a common idiom.
2201        assert_eq!(ary[2].as_ref().extract::<&Array>().unwrap().len(), 3);
2202        assert_eq!(ary[2].as_ref().extract::<&Array>().unwrap()[0].as_ref().extract::<&i32>().ok().unwrap(), &1);
2203    }
2204}
2205
2206#[cfg(test)]
2207#[macro_use]
2208extern crate serde_derive;
2209#[cfg(test)]
2210extern crate bincode;
2211
2212#[cfg(test)]
2213mod test_derive {
2214    use bincode::{serialize, deserialize, Infinite};
2215
2216    init_fed!(@deriving:[Serialize, Deserialize]);
2217    use self::fed::*;
2218
2219    fed!(
2220        usize,
2221        bool,
2222        Option<String>,
2223        char,
2224    );
2225
2226    #[test]
2227    fn test_derived() {
2228        let a: Fed4<_,_,_,_> = 42.into();
2229
2230        let encoded = serialize(&a, Infinite).unwrap();
2231
2232        let decoded = deserialize(&encoded[..]).unwrap();
2233
2234        assert_eq!(a, decoded);
2235    }
2236}