@@ -115,16 +115,42 @@ where
115
115
}
116
116
117
117
#[ inline]
118
- fn nth ( & mut self , mut n : usize ) -> Option < A :: Item > {
118
+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , usize > {
119
+ let mut rem = n;
120
+
119
121
if let Some ( ref mut a) = self . a {
120
- while let Some ( x) = a. next ( ) {
121
- if n == 0 {
122
- return Some ( x) ;
123
- }
124
- n -= 1 ;
122
+ match a. advance_by ( rem) {
123
+ Ok ( ( ) ) => return Ok ( ( ) ) ,
124
+ Err ( k) => rem -= k,
125
125
}
126
126
self . a = None ;
127
127
}
128
+
129
+ if let Some ( ref mut b) = self . b {
130
+ match b. advance_by ( rem) {
131
+ Ok ( ( ) ) => return Ok ( ( ) ) ,
132
+ Err ( k) => rem -= k,
133
+ }
134
+ // we don't fuse the second iterator
135
+ }
136
+
137
+ if rem == 0 { Ok ( ( ) ) } else { Err ( n - rem) }
138
+ }
139
+
140
+ #[ inline]
141
+ fn nth ( & mut self , mut n : usize ) -> Option < Self :: Item > {
142
+ if let Some ( ref mut a) = self . a {
143
+ match a. advance_by ( n) {
144
+ Ok ( ( ) ) => match a. next ( ) {
145
+ None => n = 0 ,
146
+ x => return x,
147
+ } ,
148
+ Err ( k) => n -= k,
149
+ }
150
+
151
+ self . a = None ;
152
+ }
153
+
128
154
maybe ! ( self . b. nth( n) )
129
155
}
130
156
@@ -191,16 +217,42 @@ where
191
217
}
192
218
193
219
#[ inline]
194
- fn nth_back ( & mut self , mut n : usize ) -> Option < A :: Item > {
220
+ fn advance_back_by ( & mut self , n : usize ) -> Result < ( ) , usize > {
221
+ let mut rem = n;
222
+
195
223
if let Some ( ref mut b) = self . b {
196
- while let Some ( x) = b. next_back ( ) {
197
- if n == 0 {
198
- return Some ( x) ;
199
- }
200
- n -= 1 ;
224
+ match b. advance_back_by ( rem) {
225
+ Ok ( ( ) ) => return Ok ( ( ) ) ,
226
+ Err ( k) => rem -= k,
201
227
}
202
228
self . b = None ;
203
229
}
230
+
231
+ if let Some ( ref mut a) = self . a {
232
+ match a. advance_back_by ( rem) {
233
+ Ok ( ( ) ) => return Ok ( ( ) ) ,
234
+ Err ( k) => rem -= k,
235
+ }
236
+ // we don't fuse the second iterator
237
+ }
238
+
239
+ if rem == 0 { Ok ( ( ) ) } else { Err ( n - rem) }
240
+ }
241
+
242
+ #[ inline]
243
+ fn nth_back ( & mut self , mut n : usize ) -> Option < Self :: Item > {
244
+ if let Some ( ref mut b) = self . b {
245
+ match b. advance_back_by ( n) {
246
+ Ok ( ( ) ) => match b. next_back ( ) {
247
+ None => n = 0 ,
248
+ x => return x,
249
+ } ,
250
+ Err ( k) => n -= k,
251
+ }
252
+
253
+ self . b = None ;
254
+ }
255
+
204
256
maybe ! ( self . a. nth_back( n) )
205
257
}
206
258
0 commit comments