@@ -175,21 +175,12 @@ impl<T> Deque<T> for DList<T> {
175
175
///
176
176
/// O(1)
177
177
fn pop_back ( & mut self ) -> Option < T > {
178
- match self . list_tail . resolve ( ) {
179
- None => None ,
180
- Some ( tail) => {
181
- self . length -= 1 ;
182
- let tail_own = match tail. prev . resolve ( ) {
183
- None => {
184
- self . list_tail = Rawlink :: none ( ) ;
185
- self . list_head . take_unwrap ( )
186
- } ,
187
- Some ( tail_prev) => {
188
- self . list_tail = tail. prev ;
189
- tail_prev. next . take_unwrap ( )
190
- }
191
- } ;
192
- Some ( tail_own. value )
178
+ do self . list_tail . resolve ( ) . map_consume |tail| {
179
+ self . length -= 1 ;
180
+ self . list_tail = tail. prev ;
181
+ match tail. prev . resolve ( ) {
182
+ None => self . list_head . take_unwrap ( ) . value ,
183
+ Some ( tail_prev) => tail_prev. next . take_unwrap ( ) . value
193
184
}
194
185
}
195
186
}
@@ -217,21 +208,13 @@ impl<T> Deque<T> for DList<T> {
217
208
///
218
209
/// O(1)
219
210
fn pop_front ( & mut self ) -> Option < T > {
220
- match self . list_head . take ( ) {
221
- None => None ,
222
- Some ( old_head) => {
223
- self . length -= 1 ;
224
- match * old_head {
225
- Node { value : value, next : Some ( next) , prev : _} => {
226
- self . list_head = link_with_prev ( next, Rawlink :: none ( ) ) ;
227
- Some ( value)
228
- }
229
- Node { value : value, next : None , prev : _} => {
230
- self . list_tail = Rawlink :: none ( ) ;
231
- Some ( value)
232
- }
233
- }
211
+ do self . list_head . take ( ) . map_consume |~Node { value, next, _} | {
212
+ self . length -= 1 ;
213
+ match next {
214
+ Some ( node) => self . list_head = link_with_prev ( node, Rawlink :: none ( ) ) ,
215
+ None => self . list_tail = Rawlink :: none ( )
234
216
}
217
+ value
235
218
}
236
219
}
237
220
}
@@ -251,7 +234,7 @@ impl<T> DList<T> {
251
234
None => * self = other,
252
235
Some ( tail) => {
253
236
match other {
254
- DList { list_head : None , list_tail : _ , length : _} => return ,
237
+ DList { list_head : None , _} => return ,
255
238
DList { list_head : Some ( node) , list_tail : o_tail, length : o_length} => {
256
239
tail. next = link_with_prev ( node, self . list_tail ) ;
257
240
self . list_tail = o_tail;
@@ -377,13 +360,10 @@ impl<'self, A> Iterator<&'self A> for DListIterator<'self, A> {
377
360
if self . nelem == 0 {
378
361
return None ;
379
362
}
380
- match * self . head {
381
- None => None ,
382
- Some ( ref head) => {
383
- self . nelem -= 1 ;
384
- self . head = & head. next ;
385
- Some ( & head. value )
386
- }
363
+ do self. head . map |head| {
364
+ self . nelem -= 1 ;
365
+ self . head = & head. next ;
366
+ & head. value
387
367
}
388
368
}
389
369
@@ -399,13 +379,10 @@ impl<'self, A> DoubleEndedIterator<&'self A> for DListIterator<'self, A> {
399
379
if self . nelem == 0 {
400
380
return None ;
401
381
}
402
- match self . tail . resolve ( ) {
403
- None => None ,
404
- Some ( prev) => {
405
- self . nelem -= 1 ;
406
- self . tail = prev. prev ;
407
- Some ( & prev. value )
408
- }
382
+ do self. tail . resolve ( ) . map_consume |prev| {
383
+ self . nelem -= 1 ;
384
+ self . tail = prev. prev ;
385
+ & prev. value
409
386
}
410
387
}
411
388
}
@@ -416,16 +393,13 @@ impl<'self, A> Iterator<&'self mut A> for MutDListIterator<'self, A> {
416
393
if self . nelem == 0 {
417
394
return None ;
418
395
}
419
- match self . head . resolve ( ) {
420
- None => None ,
421
- Some ( next) => {
422
- self . nelem -= 1 ;
423
- self . head = match next. next {
424
- Some ( ref mut node) => Rawlink :: some ( & mut * * node) ,
425
- None => Rawlink :: none ( ) ,
426
- } ;
427
- Some ( & mut next. value )
428
- }
396
+ do self. head . resolve ( ) . map_consume |next| {
397
+ self . nelem -= 1 ;
398
+ self . head = match next. next {
399
+ Some ( ref mut node) => Rawlink :: some ( & mut * * node) ,
400
+ None => Rawlink :: none ( ) ,
401
+ } ;
402
+ & mut next. value
429
403
}
430
404
}
431
405
@@ -441,13 +415,10 @@ impl<'self, A> DoubleEndedIterator<&'self mut A> for MutDListIterator<'self, A>
441
415
if self . nelem == 0 {
442
416
return None ;
443
417
}
444
- match self . tail . resolve ( ) {
445
- None => None ,
446
- Some ( prev) => {
447
- self . nelem -= 1 ;
448
- self . tail = prev. prev ;
449
- Some ( & mut prev. value )
450
- }
418
+ do self. tail . resolve ( ) . map_consume |prev| {
419
+ self . nelem -= 1 ;
420
+ self . tail = prev. prev ;
421
+ & mut prev. value
451
422
}
452
423
}
453
424
}
@@ -484,10 +455,7 @@ impl<'self, A> ListInsertion<A> for MutDListIterator<'self, A> {
484
455
485
456
#[ inline]
486
457
fn peek_next < ' a > ( & ' a mut self ) -> Option < & ' a mut A > {
487
- match self . head . resolve ( ) {
488
- None => None ,
489
- Some ( head) => Some ( & mut head. value ) ,
490
- }
458
+ self . head . resolve ( ) . map_consume ( |head| & mut head. value )
491
459
}
492
460
}
493
461
0 commit comments