pub trait Tuple { type AsRef<'a>: Tuple where Self: 'a; type AsMut<'a>: Tuple where Self: 'a; type Reversed: Tuple; fn as_ref(&self) -> Self::AsRef<'_>; fn as_mut(&mut self) -> Self::AsMut<'_>; fn rev(self) -> Self::Reversed; } pub trait Tuple1: Tuple { type Item0; type Rest: Tuple; fn into_0(self) -> Self::Item0; fn split_into(self) -> (Self::Item0, Self::Rest); fn into_rest(self) -> Self::Rest; } pub trait Tuple2: Tuple1 { type Item1; type Rest: Tuple; fn into_1(self) -> Self::Item1; fn into_rest(self) -> ::Rest; } impl Tuple for () { type AsRef<'a> = () where Self: 'a; type AsMut<'a> = () where Self: 'a; type Reversed = (); fn as_ref(&self) -> Self::AsRef<'_> {} fn as_mut(&mut self) -> Self::AsMut<'_> {} fn rev(self) -> Self::Reversed {} } impl Tuple for (A,) { type AsRef<'a> = (&'a A,) where Self: 'a; type AsMut<'a> = (&'a mut A,) where Self: 'a; type Reversed = (A,); fn as_ref(&self) -> Self::AsRef<'_> { (&self.0,) } fn as_mut(&mut self) -> Self::AsMut<'_> { (&mut self.0,) } fn rev(self) -> Self::Reversed { (self.0,) } } impl Tuple for (A, B) { type AsRef<'a> = (&'a A, &'a B) where Self: 'a; type AsMut<'a> = (&'a mut A, &'a mut B) where Self: 'a; type Reversed = (B, A); fn as_ref(&self) -> Self::AsRef<'_> { (&self.0, &self.1) } fn as_mut(&mut self) -> Self::AsMut<'_> { (&mut self.0, &mut self.1) } fn rev(self) -> Self::Reversed { (self.1, self.0) } } impl Tuple1 for (A,) { type Item0 = A; type Rest = (); fn into_0(self) -> Self::Item0 { self.0 } fn split_into(self) -> (Self::Item0, ::Rest) { (self.0, ()) } fn into_rest(self) -> Self::Rest {} } impl Tuple1 for (A, B) { type Item0 = A; type Rest = (B,); fn into_0(self) -> Self::Item0 { self.0 } fn split_into(self) -> (Self::Item0, ::Rest) { (self.0, (self.1,)) } fn into_rest(self) -> Self::Rest { (self.1,) } } impl> Tuple2 for T { type Item1 = R::Item0; type Rest = R::Rest; fn into_1(self) -> Self::Item1 { self.into_rest().into_0() } fn into_rest(self) -> ::Rest { self.into_rest().into_rest() } }