use crate::element::Element;
pub trait IntoChildren<Msg, Marker> {
fn into_children(self) -> Vec<Element<Msg>>;
}
pub struct FromIter;
pub struct FromTuple;
impl<Msg, I, T> IntoChildren<Msg, FromIter> for I
where
I: IntoIterator<Item = T>,
T: Into<Element<Msg>>,
{
fn into_children(self) -> Vec<Element<Msg>> {
self.into_iter().map(Into::into).collect()
}
}
macro_rules! tuple_children {
($($t:ident),+) => {
impl<Msg, $($t: Into<Element<Msg>>),+> IntoChildren<Msg, FromTuple> for ($($t,)+) {
#[expect(
non_snake_case,
reason = "macro_rules can only bind tuple fields by their type-parameter names"
)]
fn into_children(self) -> Vec<Element<Msg>> {
let ($($t,)+) = self;
vec![$($t.into()),+]
}
}
};
}
tuple_children!(A);
tuple_children!(A, B);
tuple_children!(A, B, C);
tuple_children!(A, B, C, D);
tuple_children!(A, B, C, D, E);
tuple_children!(A, B, C, D, E, F);
tuple_children!(A, B, C, D, E, F, G);
tuple_children!(A, B, C, D, E, F, G, H);
tuple_children!(A, B, C, D, E, F, G, H, I);
tuple_children!(A, B, C, D, E, F, G, H, I, J);
tuple_children!(A, B, C, D, E, F, G, H, I, J, K);
tuple_children!(A, B, C, D, E, F, G, H, I, J, K, L);