1use crate::alloc::{Allocator, Global};
2use crate::error::Error;
34/// Conversion from an [`Iterator`] within a custom allocator `A`.
5///
6/// By implementing `TryFromIteratorIn` for a type, you define how it will be
7/// created from an iterator. This is common for types which describe a
8/// collection of some kind.
9pub trait TryFromIteratorIn<T, A: Allocator>: Sized {
10/// Creates a value from an iterator within an allocator.
11fn try_from_iter_in<I>(iter: I, alloc: A) -> Result<Self, Error>
12where
13I: IntoIterator<Item = T>;
14}
1516/// Conversion from an [`Iterator`] within the [`Global`] allocator.
17///
18/// By implementing `TryFromIteratorIn` for a type, you define how it will be created
19/// from an iterator. This is common for types which describe a collection of
20/// some kind.
21pub trait TryFromIterator<T>: TryFromIteratorIn<T, Global> {
22/// Creates a value from an iterator within an allocator.
23fn try_from_iter<I>(iter: I) -> Result<Self, Error>
24where
25I: IntoIterator<Item = T>;
26}
2728impl<T, U> TryFromIterator<T> for U
29where
30U: TryFromIteratorIn<T, Global>,
31{
32#[inline]
33fn try_from_iter<I>(iter: I) -> Result<Self, Error>
34where
35I: IntoIterator<Item = T>,
36 {
37 U::try_from_iter_in(iter, Global)
38 }
39}
4041impl<T, U, E, A: Allocator> TryFromIteratorIn<Result<T, E>, A> for Result<U, E>
42where
43U: TryFromIteratorIn<T, A>,
44{
45fn try_from_iter_in<I>(iter: I, alloc: A) -> Result<Self, Error>
46where
47I: IntoIterator<Item = Result<T, E>>,
48 {
49struct Iter<'a, I, E> {
50 error: &'a mut Option<E>,
51 iter: I,
52 }
5354impl<T, I, E> Iterator for Iter<'_, I, E>
55where
56I: Iterator<Item = Result<T, E>>,
57 {
58type Item = T;
5960fn next(&mut self) -> Option<Self::Item> {
61let value = match self.iter.next()? {
62Ok(value) => value,
63Err(error) => {
64*self.error = Some(error);
65return None;
66 }
67 };
6869Some(value)
70 }
71 }
7273let mut error = None;
7475let iter = Iter {
76 error: &mut error,
77 iter: iter.into_iter(),
78 };
7980let out = U::try_from_iter_in(iter, alloc)?;
8182match error {
83Some(error) => Ok(Err(error)),
84None => Ok(Ok(out)),
85 }
86 }
87}