ActorでConcurrentなコレクション(仮)

まだ途中のコード。
これは、真面目にやるならcaseクラスを外で定義せずにAtomicMapクラス内部で自己完結するようにしないと、ジェネリックに書けない(書けたとしても実行時エラーがひどいことになりそう)んじゃないかと思うので、あとで考える。


あと、Stopが邪魔ですね・・・。

import scala.actors.Actor
import scala.actors.Actor._

case class Insert(key: String, value: Int)
case class Get(key : String)
case object Stop

class AtomicMap extends Actor {
    private var collection: Map[String, Int] = Map()

    def act() = loop {
        receive {
            case Insert(key, value) => collection += key -> value
            case Get(key) => reply(collection.get(key))
            case Stop => exit()
        }
    }
}

object Main extends Application {
    val m = new AtomicMap
    m.start

    m ! Insert("a", 3)
    m ! Insert("b", 1)
    m ! Insert("c", 4)

    m !? Get("b") match {
        case Some(x: Int) => println(x)
        case None => println("none")
        case _ => println("error")
    }

    m ! Stop
}
1