//
// taken from  
//		http://lamp.epfl.ch/~phaller/doc/ActorsTutorial.html
//

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

package com.oy.shared.scample.scala {

	case object Ping 
	case object Pong
	case object Stop
	 
	class Ping(count: int, pong: Actor) extends Actor {
	  def act() {
	    var pingsLeft = count - 1
	    pong ! Ping
	    while (true) {
	      receive {
	        case Pong =>
	          if (pingsLeft % 1000 == 0)
	            Console.println("Ping: pong")
	          if (pingsLeft > 0) {
	            pong ! Ping
	            pingsLeft -= 1
	          } else {
	            Console.println("Ping: stop")
	            pong ! Stop
	            exit()
	          }
	      }
	    }
	  }
	}
	
	class Pong extends Actor {
	  def act() {
	    var pongCount = 0
	    while (true) {
	      receive {
	        case Ping =>
	          if (pongCount % 1000 == 0)
	            Console.println("Pong: ping "+pongCount)
	          sender ! Pong
	          pongCount = pongCount + 1
	        case Stop =>
	          Console.println("Pong: stop")
	          exit()
	      }
	    }
	  }
	}
	   
	object PingPongScala extends Application {
		def run(){ 
		  val pong = new Pong
		  val ping = new Ping(100000, pong)
		  ping.start
		  pong.start
		}
	}
 
}