diff options
Diffstat (limited to 'docs/examples/actors/boundedbuffer.scala')
-rw-r--r-- | docs/examples/actors/boundedbuffer.scala | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/docs/examples/actors/boundedbuffer.scala b/docs/examples/actors/boundedbuffer.scala new file mode 100644 index 0000000000..6bc01dfe55 --- /dev/null +++ b/docs/examples/actors/boundedbuffer.scala @@ -0,0 +1,36 @@ +package examples.actors + +import scala.actors.Actor._ + +object boundedbuffer { + class BoundedBuffer[T](N: int) { + private case class Put(x: T) + private case object Get + private case object Stop + + private val buffer = actor { + val buf = new Array[T](N) + var in = 0; var out = 0; var n = 0 + loop { + receive { + case Put(x) if n < N => + buf(in) = x; in = (in + 1) % N; n = n + 1; reply() + case Get if n > 0 => + val r = buf(out); out = (out + 1) % N; n = n - 1; reply(r) + case Stop => reply(); exit("stopped") + } + } + } + + def put(x: T) { buffer !? Put(x) } + def get: T = (buffer !? Get).asInstanceOf[T] + def stop() { buffer !? Stop } + } + + def main(args: Array[String]) = { + val buf = new BoundedBuffer[Int](1) + buf.put(42) + scala.Console.println("" + buf.get) + buf.stop() + } +} |