cross: list: implement IntoList on top of ChompTuple

this should be easier for macro generation of the impl.
This commit is contained in:
2022-08-14 19:52:37 -07:00
parent 19893157fa
commit 2225f98ec8

View File

@@ -197,6 +197,56 @@ decl_indexable!(E97, <E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13
decl_indexable!(E98, <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, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, E52, E53, E54, E55, E56, E57, E58, E59, E60, E61, E62, E63, E64, E65, E66, E67, E68, E69, E70, E71, E72, E73, E74, E75, E76, E77, E78, E79, E80, E81, E82, E83, E84, E85, E86, E87, E88, E89, E90, E91, E92, E93, E94, E95, E96, E97, E98, T>);
decl_indexable!(E99, <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, E32, E33, E34, E35, E36, E37, E38, E39, E40, E41, E42, E43, E44, E45, E46, E47, E48, E49, E50, E51, E52, E53, E54, E55, E56, E57, E58, E59, E60, E61, E62, E63, E64, E65, E66, E67, E68, E69, E70, E71, E72, E73, E74, E75, E76, E77, E78, E79, E80, E81, E82, E83, E84, E85, E86, E87, E88, E89, E90, E91, E92, E93, E94, E95, E96, E97, E98, E99, T>);
pub trait ChompTuple {
type Head;
type Tail;
fn chomp(self) -> (Self::Head, Self::Tail);
}
impl<E0> ChompTuple for (E0,) {
type Head = E0;
type Tail = ();
fn chomp(self) -> (Self::Head, Self::Tail) {
(self.0, ())
}
}
impl<E0, E1> ChompTuple for (E0, E1) {
type Head = E0;
type Tail = (E1,);
fn chomp(self) -> (Self::Head, Self::Tail) {
(self.0, (self.1,))
}
}
impl<E0, E1, E2> ChompTuple for (E0, E1, E2) {
type Head = E0;
type Tail = (E1, E2);
fn chomp(self) -> (Self::Head, Self::Tail) {
(self.0, (self.1, self.2))
}
}
impl<E0, E1, E2, E3> ChompTuple for (E0, E1, E2, E3) {
type Head = E0;
type Tail = (E1, E2, E3);
fn chomp(self) -> (Self::Head, Self::Tail) {
(self.0, (self.1, self.2, self.3))
}
}
impl<T: ChompTuple> IntoList for T
where T::Tail: IntoList
{
type List = Node<
T::Head,
<T::Tail as IntoList>::List,
>;
fn into_list(self) -> Self::List {
let (head, tail) = self.chomp();
Node::new(head, tail.into_list())
}
}
pub trait IntoList {
type List;
@@ -210,34 +260,6 @@ impl IntoList for () {
}
}
impl<E0> IntoList for (E0,) {
type List = Node<E0, <() as IntoList>::List>;
fn into_list(self) -> Self::List {
Node::new(self.0, ().into_list())
}
}
impl<E0, E1> IntoList for (E0, E1) {
type List = Node<E0, <(E1,) as IntoList>::List>;
fn into_list(self) -> Self::List {
Node::new(self.0, (self.1,).into_list())
}
}
impl<E0, E1, E2> IntoList for (E0, E1, E2) {
type List = Node<E0, <(E1, E2) as IntoList>::List>;
fn into_list(self) -> Self::List {
Node::new(self.0, (self.1, self.2).into_list())
}
}
impl<E0, E1, E2, E3> IntoList for (E0, E1, E2, E3) {
type List = Node<E0, <(E1, E2, E3) as IntoList>::List>;
fn into_list(self) -> Self::List {
Node::new(self.0, (self.1, self.2, self.3).into_list())
}
}
pub type Prepended<E, Tail> = Node<E, Tail>;
pub trait Prependable {
fn prepend<E>(self, e: E) -> Node<E, Self>;