1use super::{write_into, WriteInto};
2use std::io;
3use std::iter::{ExactSizeIterator, IntoIterator};
4
5pub struct Sequence<T>(pub T)
21where
22 T: IntoIterator,
23 T::Item: WriteInto;
24
25impl<T> WriteInto for Sequence<T>
27where
28 T: IntoIterator,
29 T::Item: WriteInto,
30{
31 type Output = usize;
32
33 fn write_into(self, sink: &mut impl io::Write) -> io::Result<usize> {
34 let mut written = 0;
35 for item in self.0 {
36 write_into(sink, item)?;
37 written += 1;
38 }
39
40 Ok(written)
41 }
42}
43
44impl<T> WriteInto for &Sequence<T>
46where
47 T: Copy + IntoIterator,
48 T::Item: WriteInto,
49{
50 type Output = usize;
51
52 fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
53 write_into(sink, Sequence(self.0))
54 }
55}
56
57pub struct SizedSequence<T, S, F>(pub F, pub T)
73where
74 T: IntoIterator,
75 T::Item: WriteInto,
76 T::IntoIter: ExactSizeIterator,
77 S: WriteInto,
78 F: FnOnce(usize) -> S;
79
80impl<T, S, F> WriteInto for SizedSequence<T, S, F>
82where
83 T: IntoIterator,
84 T::Item: WriteInto,
85 T::IntoIter: ExactSizeIterator,
86 S: WriteInto,
87 F: FnOnce(usize) -> S,
88{
89 type Output = usize;
90
91 fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
92 let iterator = self.1.into_iter();
93 let size = iterator.len();
94
95 write_into(sink, (self.0)(size))?;
96 let mut written = 0;
97 for item in iterator {
98 write_into(sink, item)?;
99 written += 1;
100 }
101
102 Ok(written)
103 }
104}
105
106impl<T, S, F> WriteInto for &SizedSequence<T, S, F>
108where
109 T: Copy + IntoIterator,
110 T::Item: WriteInto,
111 T::IntoIter: ExactSizeIterator,
112 S: WriteInto,
113 F: Copy + FnOnce(usize) -> S,
114{
115 type Output = usize;
116
117 fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
118 write_into(sink, SizedSequence(self.0, self.1))
119 }
120}