1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// See the COPYRIGHT file at the top-level directory of this distribution.
// Licensed under MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>

/// Recursive descent converting
pub enum LR<L,R> {
    L(L), // CAR
    R(R), // CDR
}

/// Placeholder in the last `R` variant of nested `LR`s.
pub enum Enum0 {}

/// Anonymous `enum`.
/// The library users do not need to implement this trait by hand.
/// Simply use `Enum1`, `Enum2`, `Enum3`... etc.
pub trait EnumX {
    type LR;
    fn from_lr( lr: Self::LR ) -> Self;
    fn into_lr( self ) -> Self::LR;
}

use enumx_derive::EnumXDerives;

macro_rules! enumx_types {
    ($( $enum:ident<$($generic:ident),+>{ $($variant:ident)+ } )+) => {$(
        #[derive( EnumXDerives )]
        #[derive( Debug,PartialEq,Eq,PartialOrd,Ord )]
        pub enum $enum<$($generic),+> {
            $( $variant( $generic )),+
        }

        impl<$($generic),+> $enum<$($generic),+> {$(
            pub fn $variant( e: $generic ) -> Self {
                $enum::$variant( e )
            }
        )+}
    )+}
}

enumx_types! {
     Enum1<E0>{ _0 }
     Enum2<E0,E1>{ _0 _1 }
     Enum3<E0,E1,E2>{ _0 _1 _2 }
     Enum4<E0,E1,E2,E3>{ _0 _1 _2 _3 }
     Enum5<E0,E1,E2,E3,E4>{ _0 _1 _2 _3 _4 }
     Enum6<E0,E1,E2,E3,E4,E5>{ _0 _1 _2 _3 _4 _5 }
     Enum7<E0,E1,E2,E3,E4,E5,E6>{ _0 _1 _2 _3 _4 _5 _6 }
     Enum8<E0,E1,E2,E3,E4,E5,E6,E7>{ _0 _1 _2 _3 _4 _5 _6 _7 }
     Enum9<E0,E1,E2,E3,E4,E5,E6,E7,E8>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 }
     Enum10<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 }
     Enum11<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 }
     Enum12<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 }
     Enum13<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 }
     Enum14<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 }
     Enum15<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 }
     Enum16<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 }
     Enum17<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 }
     Enum18<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 }
     Enum19<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 }
     Enum20<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 }
     Enum21<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 }
     Enum22<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 }
     Enum23<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 }
     Enum24<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 }
     Enum25<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 }
     Enum26<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 }
     Enum27<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 }
     Enum28<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 }
     Enum29<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 }
     Enum30<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28,E29>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 }
     Enum31<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28,E29,E30>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 }
     Enum32<E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28,E29,E30,E31>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 }
}