Skip to content

Commit 58eadc0

Browse files
committed
add method dequeueOption to immutable.Queue
This allows immutable.Queue to be used conveniently in functional code. Method is in the spirit of `headOption` on seqs or `get` on maps. Also adds a unit test for immutable.Queue.
1 parent 636307b commit 58eadc0

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/library/scala/collection/immutable/Queue.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ class Queue[+A] protected(protected val in: List[A], protected val out: List[A])
118118
case x :: xs => (x, new Queue(in, xs))
119119
case _ => throw new NoSuchElementException("dequeue on empty queue")
120120
}
121+
122+
/** Optionally retrieves the first element and a queue of the remaining elements.
123+
*
124+
* @return A tuple of the first element of the queue, and a new queue with this element removed.
125+
* If the queue is empty, `None` is returned.
126+
*/
127+
def dequeueOption: Option[(A, Queue[A])] = if(isEmpty) None else Some(dequeue)
121128

122129
/** Returns the first element in the queue, or throws an error if there
123130
* is no element contained in the queue.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package scala.collection.immutable
2+
3+
import org.junit.runner.RunWith
4+
import org.junit.runners.JUnit4
5+
import org.junit.Test
6+
7+
@RunWith(classOf[JUnit4])
8+
/* Tests for collection.immutable.Queue */
9+
class QueueTest {
10+
val emptyQueue = Queue.empty[Int]
11+
val oneAdded = emptyQueue.enqueue(1)
12+
val threeAdded = emptyQueue.enqueue(1 to 3)
13+
14+
@Test
15+
def dequeueOptionOnEmpty() {
16+
assert( emptyQueue.dequeueOption == None )
17+
}
18+
19+
@Test
20+
def dequeueOptionOneAdded() {
21+
assert( oneAdded.dequeueOption == Some((1,emptyQueue)) )
22+
}
23+
24+
@Test
25+
def dequeueOptionThreeAdded() {
26+
assert( threeAdded.dequeueOption == Some((1,Queue(2 to 3:_*))) )
27+
}
28+
}

0 commit comments

Comments
 (0)