1pub trait Flatten<O, E>: Sized {
9 fn flatten_ok<U, O2>(self) -> FlattenOk<Self, U>
28 where
29 U: IntoIterator<Item = O2>;
30 fn flatten_err<U, E2>(self) -> FlattenErr<Self, U>
57 where
58 U: IntoIterator<Item = E2>;
59}
60
61impl<I, O, E> Flatten<O, E> for I
62where
63 I: Iterator<Item = Result<O, E>> + Sized,
64{
65 #[inline]
66 fn flatten_ok<U, O2>(self) -> FlattenOk<Self, U>
67 where
68 U: IntoIterator<Item = O2>,
69 {
70 FlattenOk {
71 frontiter: None,
72 iter: self,
73 }
74 }
75
76 #[inline]
77 fn flatten_err<U, E2>(self) -> FlattenErr<Self, U>
78 where
79 U: IntoIterator<Item = E2>,
80 {
81 FlattenErr {
82 frontiter: None,
83 iter: self,
84 }
85 }
86}
87
88#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
89pub struct FlattenOk<I, U>
90where
91 U: IntoIterator,
92{
93 frontiter: Option<<U as IntoIterator>::IntoIter>,
94 iter: I,
95}
96
97impl<I, E, O2, U> Iterator for FlattenOk<I, U>
98where
99 I: Iterator<Item = Result<U, E>>,
100 U: IntoIterator<Item = O2>,
101{
102 type Item = Result<O2, E>;
103
104 fn next(&mut self) -> Option<Self::Item> {
105 loop {
106 if let Some(ref mut inner) = self.frontiter {
107 if let elt @ Some(_) = inner.next() {
108 return elt.map(Ok);
109 }
110 }
111 match self.iter.next() {
112 None => return None,
113 Some(Ok(x)) => {
114 self.frontiter = Some(x.into_iter());
115 }
116 Some(Err(e)) => return Some(Err(e)),
117 }
118 }
119 }
120
121 #[inline]
122 fn size_hint(&self) -> (usize, Option<usize>) {
125 self.iter.size_hint()
126 }
127}
128
129#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
130pub struct FlattenErr<I, U: IntoIterator> {
131 frontiter: Option<<U as IntoIterator>::IntoIter>,
132 iter: I,
133}
134
135impl<I, O, E2, U> Iterator for FlattenErr<I, U>
136where
137 I: Iterator<Item = Result<O, U>>,
138 U: IntoIterator<Item = E2>,
139{
140 type Item = Result<O, E2>;
141
142 fn next(&mut self) -> Option<Self::Item> {
143 loop {
144 if let Some(ref mut inner) = self.frontiter {
145 if let elt @ Some(_) = inner.next() {
146 return elt.map(Err);
147 }
148 }
149 match self.iter.next() {
150 None => return None,
151 Some(Err(e)) => {
152 self.frontiter = Some(e.into_iter());
153 }
154 Some(Ok(o)) => return Some(Ok(o)),
155 }
156 }
157 }
158
159 #[inline]
160 fn size_hint(&self) -> (usize, Option<usize>) {
161 self.iter.size_hint()
162 }
163}