1#[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}