soroban_sdk/
iter.rs

1//! Iterators for use with collections like [Map], [Vec].
2#[cfg(doc)]
3use crate::{Map, Vec};
4
5use core::fmt::Debug;
6use core::iter::FusedIterator;
7use core::marker::PhantomData;
8
9pub trait UnwrappedEnumerable<I, T, E> {
10    fn unwrapped(self) -> UnwrappedIter<I, T, E>;
11}
12
13impl<I, T, E> UnwrappedEnumerable<I, T, E> for I
14where
15    I: Iterator<Item = Result<T, E>>,
16    E: Debug,
17{
18    fn unwrapped(self) -> UnwrappedIter<I, T, E> {
19        UnwrappedIter {
20            iter: self,
21            item_type: PhantomData,
22            error_type: PhantomData,
23        }
24    }
25}
26
27#[derive(Clone)]
28pub struct UnwrappedIter<I, T, E> {
29    iter: I,
30    item_type: PhantomData<T>,
31    error_type: PhantomData<E>,
32}
33
34impl<I, T, E> Iterator for UnwrappedIter<I, T, E>
35where
36    I: Iterator<Item = Result<T, E>>,
37    E: Debug,
38{
39    type Item = T;
40
41    #[inline(always)]
42    fn next(&mut self) -> Option<Self::Item> {
43        self.iter.next().map(Result::unwrap)
44    }
45
46    #[inline(always)]
47    fn size_hint(&self) -> (usize, Option<usize>) {
48        self.iter.size_hint()
49    }
50}
51
52impl<I, T, E> DoubleEndedIterator for UnwrappedIter<I, T, E>
53where
54    I: Iterator<Item = Result<T, E>> + DoubleEndedIterator,
55    E: Debug,
56{
57    #[inline(always)]
58    fn next_back(&mut self) -> Option<Self::Item> {
59        self.iter.next_back().map(Result::unwrap)
60    }
61}
62
63impl<I, T, E> FusedIterator for UnwrappedIter<I, T, E>
64where
65    I: Iterator<Item = Result<T, E>> + FusedIterator,
66    E: Debug,
67{
68}
69
70impl<I, T, E> ExactSizeIterator for UnwrappedIter<I, T, E>
71where
72    I: Iterator<Item = Result<T, E>> + ExactSizeIterator,
73    E: Debug,
74{
75    #[inline(always)]
76    fn len(&self) -> usize {
77        self.iter.len()
78    }
79}