scala/ScalaBook/chapter-07/actors7.scala

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

case class InitVal(a: Actor, n: Int)
case class Val(a: Actor, n: Int, m: Int)

object actorsExample {
  def main(args: Array[String]) {
    val loopActor = actor {
      var ResActor : Actor = null
      loop{
        react {
          case Val(_,acc,1)     => 
            ResActor ! acc
            exit("done")
          case Val(a,1,count)   => 
            ResActor = a
            self ! Val(self,count,count-1)
          case Val(a,acc,count) => 
            self ! Val(self,acc*count,count-1)
        } 
      }
    }
    var factorial = actor {
      react {
        case InitVal(a,0) => a ! InitVal(a, 1)
        case InitVal(a,1) => a ! InitVal(a, 1)
        case InitVal(a,n) =>
          loopActor ! Val(self,1,n) 
          react { case f: Int => a ! InitVal(a,f) }
      }
    }
    factorial ! InitVal(self,6)
    receive { case InitVal(_, n) => println(n) }
  }
}