Skip to content

Commit 238578b

Browse files
committed
add impl of DoubleEndedIterator to FlattenOk
1 parent 38805c6 commit 238578b

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

src/flatten_ok.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use crate::size_hint;
2-
use std::{fmt, iter::FusedIterator};
2+
use std::{
3+
fmt,
4+
iter::{DoubleEndedIterator, FusedIterator},
5+
};
36

47
pub fn flatten_ok<I, T, E>(iter: I) -> FlattenOk<I, T, E>
58
where
@@ -88,6 +91,47 @@ where
8891
}
8992
}
9093

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+
91135
impl<I, T, E> Clone for FlattenOk<I, T, E>
92136
where
93137
I: Iterator<Item = Result<T, E>> + Clone,

0 commit comments

Comments
 (0)