forked from scala/scala
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboundedbuffer.scala
37 lines (32 loc) · 889 Bytes
/
boundedbuffer.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package examples.actors
import scala.actors.Actor._
object boundedbuffer {
class BoundedBuffer[T](N: Int)(implicit m: Manifest[T]) {
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, out, n = 0
loop {
react {
case Put(x) if n < N =>
buf(in) = x; in = (in + 1) % N; n += 1; reply()
case Get if n > 0 =>
val r = buf(out); out = (out + 1) % 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)
println("" + buf.get)
buf.stop()
}
}