1use crate::element::Element;
6use crate::render::RenderChunk;
7
8impl<E: Element> Element for &'_ E {
9 fn width(&self) -> usize {
10 (*self).width()
11 }
12
13 fn render(&self) -> impl DoubleEndedIterator<Item = RenderChunk<'_>> {
14 (*self).render()
15 }
16}
17
18impl<E: Element> Element for [E] {
19 fn width(&self) -> usize {
20 self.iter().map(|e| e.width()).sum()
21 }
22
23 fn render(&self) -> impl DoubleEndedIterator<Item = RenderChunk<'_>> {
24 self.iter().flat_map(|e| e.render())
25 }
26}
27
28impl Element for () {
29 fn width(&self) -> usize {
30 0
31 }
32
33 fn render(&self) -> impl DoubleEndedIterator<Item = RenderChunk<'_>> {
34 std::iter::empty()
35 }
36}
37
38macro_rules! impl_element_for_tuple {
39 ( A $( $t:ident )* , 0 $( $n:tt )* ) => {
40 impl<A $(, $t)*> Element for (A, $($t),*)
41 where
42 A: Element,
43 $($t: Element,)*
44 {
45 fn width(&self) -> usize {
46 self.0.width()
47 $(+ self.$n.width())*
48 }
49
50 fn render(&self) -> impl DoubleEndedIterator<Item = RenderChunk<'_>> {
51 self.0.render()
52 $(.chain(self.$n.render()))*
53 }
54 }
55 };
56}
57
58impl_element_for_tuple!(A, 0);
59impl_element_for_tuple!(A B, 0 1);
60impl_element_for_tuple!(A B C, 0 1 2);
61impl_element_for_tuple!(A B C D, 0 1 2 3);
62impl_element_for_tuple!(A B C D E, 0 1 2 3 4);
63impl_element_for_tuple!(A B C D E F, 0 1 2 3 4 5);
64impl_element_for_tuple!(A B C D E F G, 0 1 2 3 4 5 6);
65impl_element_for_tuple!(A B C D E F G H, 0 1 2 3 4 5 6 7);
66impl_element_for_tuple!(A B C D E F G H I, 0 1 2 3 4 5 6 7 8);
67impl_element_for_tuple!(A B C D E F G H I J, 0 1 2 3 4 5 6 7 8 9);