diff options
author | Philipp Haller <hallerp@gmail.com> | 2008-07-18 16:11:46 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2008-07-18 16:11:46 +0000 |
commit | aeb29ddfbb4ed2000c6e8ed2bc80619e2c157aff (patch) | |
tree | 764c8b1d82a039751e94acf0586bd366578d0098 /src/actors/scala/actors/MessageQueue.scala | |
parent | abcd0ec5e7d3a189ec0d6b618dba192591626dce (diff) | |
download | scala-aeb29ddfbb4ed2000c6e8ed2bc80619e2c157aff.tar.gz scala-aeb29ddfbb4ed2000c6e8ed2bc80619e2c157aff.tar.bz2 scala-aeb29ddfbb4ed2000c6e8ed2bc80619e2c157aff.zip |
Made mailbox in Actor protected (this is necess...
Made mailbox in Actor protected (this is necessary for JoinActor). Added
get and remove methods to MessageQueue.
Diffstat (limited to 'src/actors/scala/actors/MessageQueue.scala')
-rw-r--r-- | src/actors/scala/actors/MessageQueue.scala | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/src/actors/scala/actors/MessageQueue.scala b/src/actors/scala/actors/MessageQueue.scala index 8f2f6c72cc..66555b3a7f 100644 --- a/src/actors/scala/actors/MessageQueue.scala +++ b/src/actors/scala/actors/MessageQueue.scala @@ -30,7 +30,7 @@ class MessageQueueElement { * library. Classes in this package are supposed to be the only * clients of this class. * - * @version 0.9.8 + * @version 0.9.9 * @author Philipp Haller */ @serializable @@ -67,6 +67,87 @@ class MessageQueue { } } + def foldLeft[B](z: B)(f: (B, Any) => B): B = { + var acc = z + var curr = first + while (curr != null) { + acc = f(acc, curr.msg) + curr = curr.next + } + acc + } + + /** Returns the n-th msg that satisfies the predicate + * without removing it. + */ + def get(n: Int)(p: Any => Boolean): Option[Any] = { + var pos = 0 + val msg = if (null eq last) None + else { + // test first element + if (n == 0 && p(first.msg)) + Some(first.msg) + else { + var curr = first + while(curr.next != null) { + curr = curr.next + if (p(curr.msg)) { + pos += 1 + if (pos == n) + return Some(curr.msg) + } + } + None + } + } + msg + } + + /** Removes the n-th msg that satisfies the predicate. + */ + def remove(n: Int)(p: Any => Boolean): Option[(Any, OutputChannel[Any])] = { + var pos = 0 + val msg = if (null eq last) None + else { + // test first element + if (n == 0 && p(first.msg)) { + val tmp = first + // remove first element + first = first.next + + // might have to update last + if (tmp eq last) { + last = null + } + + Some((tmp.msg, tmp.session)) + } else { + var curr = first + var prev = curr + while(curr.next != null) { + prev = curr + curr = curr.next + if (p(curr.msg)) { + pos += 1 + if (pos == n) { + // remove curr + prev.next = curr.next + + // might have to update last + if (curr eq last) { + last = prev + } + + return Some((curr.msg, curr.session)) + } + } + } + None + } + } + msg + } + def extractFirst(p: Any => Boolean): MessageQueueElement = { changeSize(-1) // assume size decreases by 1 |