1#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
6pub struct NoneMore;
7
8#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
12pub struct Recursive<Inner, Value> {
13 pub inner: Inner,
16
17 pub value: Value,
19}
20
21impl<Inner, Value> Recursive<Inner, Value> {
22 pub fn new(inner: Inner, value: Value) -> Self { Self { inner, value } }
24}
25
26pub trait IntoTuple<Tuple> {
30 fn into_tuple(self) -> Tuple;
32}
33
34pub trait IntoNonRecursive {
38 type NonRecursive;
40
41 fn into_non_recursive(self) -> Self::NonRecursive;
43}
44
45pub trait IntoRecursive {
47 type Recursive;
49
50 fn into_recursive(self) -> Self::Recursive;
52}
53
54impl IntoRecursive for NoneMore {
55 type Recursive = Self;
56 fn into_recursive(self) -> Self::Recursive { self }
57}
58
59impl<Inner: IntoRecursive, Value> IntoRecursive for Recursive<Inner, Value> {
60 type Recursive = Recursive<Inner::Recursive, Value>;
61 fn into_recursive(self) -> Self::Recursive { Recursive::new(self.inner.into_recursive(), self.value) }
62}
63
64impl<I: IntoNonRecursive> IntoTuple<I::NonRecursive> for I {
66 fn into_tuple(self) -> <I as IntoNonRecursive>::NonRecursive {
67 self.into_non_recursive()
68 }
69}
70
71impl IntoRecursive for () {
73 type Recursive = NoneMore;
74 fn into_recursive(self) -> Self::Recursive { NoneMore }
75}
76
77impl IntoNonRecursive for NoneMore {
78 type NonRecursive = ();
79
80 fn into_non_recursive(self) -> Self::NonRecursive {
81 ()
82 }
83}
84
85macro_rules! gen_recursive_type {
91 () => { NoneMore };
92 ($last:ident $(,$not_last:ident)*) => {
93 Recursive<gen_recursive_type!($($not_last),*), $last>
94 };
95}
96
97macro_rules! gen_recursive_value {
103 ($self:ident;) => { NoneMore };
104 ($self:ident; $last:tt $(,$not_last:tt)*) => {
105 Recursive { inner: gen_recursive_value!($self; $($not_last),*), value: $self.$last }
106 };
107}
108
109macro_rules! gen_tuple_value {
115 ($self:ident; $($all:ident),* ) => {
116 gen_tuple_value!(@ $self; (); $($all),* )
117 };
118
119 (@ $self:ident; ($($state:expr),*);) => { ($($state .value,)*) };
120 (@ $self:ident; ($($state:expr),*); $last:ident $(,$not_last:ident)* ) => {
121 gen_tuple_value!(@ $self; ($($state .inner,)* $self); $($not_last),* )
122 };
123}
124
125macro_rules! generate_single {
130 ( $($name_fwd:ident),* ; $($name_back:ident),* ; $($index_back:tt),*) => {
131 impl<$($name_fwd),*> IntoNonRecursive for gen_recursive_type!($($name_back),*) {
132 type NonRecursive = ($($name_fwd,)*);
133 fn into_non_recursive(self) -> Self::NonRecursive {
134 gen_tuple_value!(self; $($name_fwd),*)
135 }
136 }
137
138 impl<$($name_fwd),*> IntoRecursive for ($($name_fwd,)*) {
139 type Recursive = gen_recursive_type!($($name_back),*);
140 fn into_recursive(self) -> Self::Recursive {
141 gen_recursive_value!(self; $($index_back),*)
142 }
143 }
144 };
145}
146
147generate_single!(A; A; 0);
148generate_single!(A,B; B,A; 1,0);
149generate_single!(A,B,C; C,B,A; 2,1,0);
150generate_single!(A,B,C,D; D,C,B,A; 3,2,1,0);
151generate_single!(A,B,C,D,E; E,D,C,B,A; 4,3,2,1,0);
152generate_single!(A,B,C,D,E,F; F,E,D,C,B,A; 5,4,3,2,1,0);
153generate_single!(A,B,C,D,E,F,G; G,F,E,D,C,B,A; 6,5,4,3,2,1,0);
154generate_single!(A,B,C,D,E,F,G,H; H,G,F,E,D,C,B,A; 7,6,5,4,3,2,1,0);
155generate_single!(A,B,C,D,E,F,G,H,I; I,H,G,F,E,D,C,B,A; 8,7,6,5,4,3,2,1,0);
156generate_single!(A,B,C,D,E,F,G,H,I,J; J,I,H,G,F,E,D,C,B,A; 9,8,7,6,5,4,3,2,1,0);
157generate_single!(A,B,C,D,E,F,G,H,I,J,K; K,J,I,H,G,F,E,D,C,B,A; 10,9,8,7,6,5,4,3,2,1,0);
158generate_single!(A,B,C,D,E,F,G,H,I,J,K,L; L,K,J,I,H,G,F,E,D,C,B,A; 11,10,9,8,7,6,5,4,3,2,1,0);
159generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M; M,L,K,J,I,H,G,F,E,D,C,B,A; 12,11,10,9,8,7,6,5,4,3,2,1,0);
160generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N; N,M,L,K,J,I,H,G,F,E,D,C,B,A; 13,12,11,10,9,8,7,6,5,4,3,2,1,0);
161generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O; O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
162generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P; P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
163generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q; Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
164generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R; R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
165generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S; S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
166generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T; T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
167generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U; U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
168generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V; V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
169generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W; W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
170generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X; X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
171generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y; Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
172generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
173generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1; A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
174generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1; B1,A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
175generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1; C1,B1,A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
176generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1; D1,C1,B1,A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
177generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1; E1,D1,C1,B1,A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
178generate_single!(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1; F1,E1,D1,C1,B1,A1,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A; 31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);