Skip to content

Commit 5336bdc

Browse files
author
blake2-ppc
committed
dlist: Simplify match clauses to use Option methods
Make the core Deque implementation a bit simpler by using Option methods when we simply map on a Some value, and deduplicate some common lines.
1 parent 60cb9c0 commit 5336bdc

File tree

1 file changed

+33
-65
lines changed

1 file changed

+33
-65
lines changed

src/libextra/dlist.rs

Lines changed: 33 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -175,21 +175,12 @@ impl<T> Deque<T> for DList<T> {
175175
///
176176
/// O(1)
177177
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
193184
}
194185
}
195186
}
@@ -217,21 +208,13 @@ impl<T> Deque<T> for DList<T> {
217208
///
218209
/// O(1)
219210
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()
234216
}
217+
value
235218
}
236219
}
237220
}
@@ -251,7 +234,7 @@ impl<T> DList<T> {
251234
None => *self = other,
252235
Some(tail) => {
253236
match other {
254-
DList{list_head: None, list_tail: _, length: _} => return,
237+
DList{list_head: None, _} => return,
255238
DList{list_head: Some(node), list_tail: o_tail, length: o_length} => {
256239
tail.next = link_with_prev(node, self.list_tail);
257240
self.list_tail = o_tail;
@@ -377,13 +360,10 @@ impl<'self, A> Iterator<&'self A> for DListIterator<'self, A> {
377360
if self.nelem == 0 {
378361
return None;
379362
}
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
387367
}
388368
}
389369

@@ -399,13 +379,10 @@ impl<'self, A> DoubleEndedIterator<&'self A> for DListIterator<'self, A> {
399379
if self.nelem == 0 {
400380
return None;
401381
}
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
409386
}
410387
}
411388
}
@@ -416,16 +393,13 @@ impl<'self, A> Iterator<&'self mut A> for MutDListIterator<'self, A> {
416393
if self.nelem == 0 {
417394
return None;
418395
}
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
429403
}
430404
}
431405

@@ -441,13 +415,10 @@ impl<'self, A> DoubleEndedIterator<&'self mut A> for MutDListIterator<'self, A>
441415
if self.nelem == 0 {
442416
return None;
443417
}
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
451422
}
452423
}
453424
}
@@ -484,10 +455,7 @@ impl<'self, A> ListInsertion<A> for MutDListIterator<'self, A> {
484455

485456
#[inline]
486457
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)
491459
}
492460
}
493461

0 commit comments

Comments
 (0)