summaryrefslogtreecommitdiff
path: root/docs/examples/actors/boundedbuffer.scala
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2007-02-02 15:17:51 +0000
committerPhilipp Haller <hallerp@gmail.com>2007-02-02 15:17:51 +0000
commit7cc5c06947e40236ee16a6a09d3de524183fda86 (patch)
tree8b22f79f79ffcb4b8485a3c6b21380efdc66d903 /docs/examples/actors/boundedbuffer.scala
parent8c1bbafee4c68ccd158786deb4643d5a3074ce0d (diff)
downloadscala-7cc5c06947e40236ee16a6a09d3de524183fda86.tar.gz
scala-7cc5c06947e40236ee16a6a09d3de524183fda86.tar.bz2
scala-7cc5c06947e40236ee16a6a09d3de524183fda86.zip
Cleaned-up actor examples.
Diffstat (limited to 'docs/examples/actors/boundedbuffer.scala')
-rw-r--r--docs/examples/actors/boundedbuffer.scala36
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()
+ }
+}