messagequeue.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 116 行

SCALA
116
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2005-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: MessageQueue.scala 14416 2008-03-19 01:17:25Z mihaylov $package scala.actors/** * This class is used by our efficient message queue * implementation. * * @version 0.9.9 * @author Philipp Haller */@serializableclass MessageQueueElement {  var msg: Any = _  var session: OutputChannel[Any] = null  var next: MessageQueueElement = null}/** * The class <code>MessageQueue</code> provides an efficient * implementation of a message queue specialized for this actor * library. Classes in this package are supposed to be the only * clients of this class. * * @version 0.9.8 * @author Philipp Haller */@serializableclass MessageQueue {  var first: MessageQueueElement = null  // last == null iff list empty  var last: MessageQueueElement = null  def isEmpty = null eq last  private var _size = 0  def size = _size  protected def changeSize(diff: Int) = {    _size += diff  }  def append(msg: Any, session: OutputChannel[Any]) = {    changeSize(1) // size always increases by 1    if (null eq last) { // list empty      val el = new MessageQueueElement      el.msg = msg      el.session = session      first = el      last = el    }    else {      val el = new MessageQueueElement      el.msg = msg      el.session = session      last.next = el      last = el    }  }  def extractFirst(p: Any => Boolean): MessageQueueElement = {    changeSize(-1) // assume size decreases by 1    val msg = if (null eq last) null    else {      // test first element      if (p(first.msg)) {        val tmp = first        // remove first element        first = first.next        // might have to update last        if (tmp eq last) {          last = null        }        tmp      }      else {        var curr = first        var prev = curr        while(curr.next != null) {          prev = curr          curr = curr.next          if (p(curr.msg)) {            // remove curr            prev.next = curr.next            // might have to update last            if (curr eq last) {              last = prev            }            return curr          }        }        null      }    }    if (null eq msg)      changeSize(1) // correct wrong assumption    msg  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?