1use super::{TursoFromIterator, TursoIteratorExt};
2use crate::alloc::TryReserveError;
3
4impl<T, C> TursoFromIterator<Option<T>> for Option<C>
5where
6 C: TursoFromIterator<T>,
7{
8 fn try_from_iter<I>(iter: I) -> Result<Self, TryReserveError>
9 where
10 I: IntoIterator<Item = Option<T>>,
11 {
12 let mut saw_none = false;
13 let values = C::try_from_iter(iter.into_iter().map_while(|item| match item {
14 Some(value) => Some(value),
15 None => {
16 saw_none = true;
17 None
18 }
19 }))?;
20 if saw_none {
21 Ok(None)
22 } else {
23 Ok(Some(values))
24 }
25 }
26
27 fn try_extend<I>(&mut self, iter: I) -> Result<(), TryReserveError>
28 where
29 I: IntoIterator<Item = Option<T>>,
30 {
31 let Some(values) = self else {
32 return Ok(());
33 };
34 let mut saw_none = false;
35 values.try_extend(iter.into_iter().map_while(|item| match item {
36 Some(value) => Some(value),
37 None => {
38 saw_none = true;
39 None
40 }
41 }))?;
42 if saw_none {
43 *self = None;
44 }
45 Ok(())
46 }
47}
48
49impl<T, E, F, C> TursoFromIterator<Result<T, E>> for Result<C, F>
50where
51 C: TursoFromIterator<T>,
52 F: From<E>,
53{
54 fn try_from_iter<I>(iter: I) -> Result<Self, TryReserveError>
55 where
56 I: IntoIterator<Item = Result<T, E>>,
57 {
58 let mut error = None;
59 let values = C::try_from_iter(iter.into_iter().map_while(|item| match item {
60 Ok(value) => Some(value),
61 Err(err) => {
62 error = Some(F::from(err));
63 None
64 }
65 }))?;
66 if let Some(error) = error {
67 Ok(Err(error))
68 } else {
69 Ok(Ok(values))
70 }
71 }
72
73 fn try_extend<I>(&mut self, iter: I) -> Result<(), TryReserveError>
74 where
75 I: IntoIterator<Item = Result<T, E>>,
76 {
77 let Ok(values) = self else {
78 return Ok(());
79 };
80 let mut error = None;
81 values.try_extend(iter.into_iter().map_while(|item| match item {
82 Ok(value) => Some(value),
83 Err(err) => {
84 error = Some(F::from(err));
85 None
86 }
87 }))?;
88 if let Some(error) = error {
89 *self = Err(error);
90 }
91 Ok(())
92 }
93}
94
95impl<I: Iterator> TursoIteratorExt for I {}
96
97macro_rules! impl_tuple_from_iterator {
98 ($(($ty:ident, $from_ty:ident, $item:ident, $collection:ident)),+) => {
99 impl<$($ty,)+ $($from_ty,)+> TursoFromIterator<($($ty,)+)> for ($($from_ty,)+)
100 where
101 $($from_ty: TursoFromIterator<$ty>,)+
102 {
103 fn try_from_iter<Iter>(iter: Iter) -> Result<Self, TryReserveError>
104 where
105 Iter: IntoIterator<Item = ($($ty,)+)>,
106 {
107 let mut values = ($($from_ty::try_from_iter(std::iter::empty())?,)+);
108 values.try_extend(iter)?;
109 Ok(values)
110 }
111
112 fn try_extend<Iter>(&mut self, iter: Iter) -> Result<(), TryReserveError>
113 where
114 Iter: IntoIterator<Item = ($($ty,)+)>,
115 {
116 let ($($collection,)+) = self;
117 for ($($item,)+) in iter {
118 $($collection.try_extend(std::iter::once($item))?;)+
119 }
120 Ok(())
121 }
122 }
123 };
124}
125
126impl_tuple_from_iterator!((A, FromA, a, from_a));
127impl_tuple_from_iterator!((A, FromA, a, from_a), (B, FromB, b, from_b));
128impl_tuple_from_iterator!(
129 (A, FromA, a, from_a),
130 (B, FromB, b, from_b),
131 (C, FromC, c, from_c)
132);
133impl_tuple_from_iterator!(
134 (A, FromA, a, from_a),
135 (B, FromB, b, from_b),
136 (C, FromC, c, from_c),
137 (D, FromD, d, from_d)
138);
139impl_tuple_from_iterator!(
140 (A, FromA, a, from_a),
141 (B, FromB, b, from_b),
142 (C, FromC, c, from_c),
143 (D, FromD, d, from_d),
144 (E, FromE, e, from_e)
145);
146impl_tuple_from_iterator!(
147 (A, FromA, a, from_a),
148 (B, FromB, b, from_b),
149 (C, FromC, c, from_c),
150 (D, FromD, d, from_d),
151 (E, FromE, e, from_e),
152 (F, FromF, f, from_f)
153);
154impl_tuple_from_iterator!(
155 (A, FromA, a, from_a),
156 (B, FromB, b, from_b),
157 (C, FromC, c, from_c),
158 (D, FromD, d, from_d),
159 (E, FromE, e, from_e),
160 (F, FromF, f, from_f),
161 (G, FromG, g, from_g)
162);
163impl_tuple_from_iterator!(
164 (A, FromA, a, from_a),
165 (B, FromB, b, from_b),
166 (C, FromC, c, from_c),
167 (D, FromD, d, from_d),
168 (E, FromE, e, from_e),
169 (F, FromF, f, from_f),
170 (G, FromG, g, from_g),
171 (H, FromH, h, from_h)
172);
173impl_tuple_from_iterator!(
174 (A, FromA, a, from_a),
175 (B, FromB, b, from_b),
176 (C, FromC, c, from_c),
177 (D, FromD, d, from_d),
178 (E, FromE, e, from_e),
179 (F, FromF, f, from_f),
180 (G, FromG, g, from_g),
181 (H, FromH, h, from_h),
182 (I, FromI, i, from_i)
183);
184impl_tuple_from_iterator!(
185 (A, FromA, a, from_a),
186 (B, FromB, b, from_b),
187 (C, FromC, c, from_c),
188 (D, FromD, d, from_d),
189 (E, FromE, e, from_e),
190 (F, FromF, f, from_f),
191 (G, FromG, g, from_g),
192 (H, FromH, h, from_h),
193 (I, FromI, i, from_i),
194 (J, FromJ, j, from_j)
195);
196impl_tuple_from_iterator!(
197 (A, FromA, a, from_a),
198 (B, FromB, b, from_b),
199 (C, FromC, c, from_c),
200 (D, FromD, d, from_d),
201 (E, FromE, e, from_e),
202 (F, FromF, f, from_f),
203 (G, FromG, g, from_g),
204 (H, FromH, h, from_h),
205 (I, FromI, i, from_i),
206 (J, FromJ, j, from_j),
207 (K, FromK, k, from_k)
208);
209impl_tuple_from_iterator!(
210 (A, FromA, a, from_a),
211 (B, FromB, b, from_b),
212 (C, FromC, c, from_c),
213 (D, FromD, d, from_d),
214 (E, FromE, e, from_e),
215 (F, FromF, f, from_f),
216 (G, FromG, g, from_g),
217 (H, FromH, h, from_h),
218 (I, FromI, i, from_i),
219 (J, FromJ, j, from_j),
220 (K, FromK, k, from_k),
221 (L, FromL, l, from_l)
222);