|
1 | 1 | use crate::size_hint;
|
2 |
| -use std::{fmt, iter::FusedIterator}; |
| 2 | +use std::{ |
| 3 | + fmt, |
| 4 | + iter::{DoubleEndedIterator, FusedIterator}, |
| 5 | +}; |
3 | 6 |
|
4 | 7 | pub fn flatten_ok<I, T, E>(iter: I) -> FlattenOk<I, T, E>
|
5 | 8 | where
|
|
88 | 91 | }
|
89 | 92 | }
|
90 | 93 |
|
| 94 | +impl<I, T, E> DoubleEndedIterator for FlattenOk<I, T, E> |
| 95 | +where |
| 96 | + I: DoubleEndedIterator<Item = Result<T, E>>, |
| 97 | + T: IntoIterator, |
| 98 | + T::IntoIter: DoubleEndedIterator, |
| 99 | +{ |
| 100 | + fn next_back(&mut self) -> Option<Self::Item> { |
| 101 | + loop { |
| 102 | + // Handle the back inner iterator. |
| 103 | + if let Some(inner) = &mut self.inner_back { |
| 104 | + if let Some(item) = inner.next_back() { |
| 105 | + return Some(Ok(item)); |
| 106 | + } else { |
| 107 | + // This is necessary for the iterator to implement `FusedIterator` |
| 108 | + // with only the orginal iterator being fused. |
| 109 | + self.inner_back = None; |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + match self.iter.next_back() { |
| 114 | + Some(Ok(ok)) => self.inner_back = Some(ok.into_iter()), |
| 115 | + Some(Err(e)) => return Some(Err(e)), |
| 116 | + None => { |
| 117 | + // Handle the front inner iterator. |
| 118 | + if let Some(inner) = &mut self.inner_front { |
| 119 | + if let Some(item) = inner.next_back() { |
| 120 | + return Some(Ok(item)); |
| 121 | + } else { |
| 122 | + // This is necessary for the iterator to implement `FusedIterator` |
| 123 | + // with only the orginal iterator being fused. |
| 124 | + self.inner_front = None; |
| 125 | + } |
| 126 | + } else { |
| 127 | + return None; |
| 128 | + } |
| 129 | + } |
| 130 | + } |
| 131 | + } |
| 132 | + } |
| 133 | +} |
| 134 | + |
91 | 135 | impl<I, T, E> Clone for FlattenOk<I, T, E>
|
92 | 136 | where
|
93 | 137 | I: Iterator<Item = Result<T, E>> + Clone,
|
|
0 commit comments