Skip to main content

clt_database/alloc/collections/
iterator.rs

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);