diff options
Diffstat (limited to 'docs/examples/actors')
-rw-r--r-- | docs/examples/actors/auction.scala | 131 | ||||
-rw-r--r-- | docs/examples/actors/boundedbuffer.scala | 37 | ||||
-rw-r--r-- | docs/examples/actors/channels.scala | 32 | ||||
-rw-r--r-- | docs/examples/actors/fringe.scala | 82 | ||||
-rw-r--r-- | docs/examples/actors/links.scala | 47 | ||||
-rw-r--r-- | docs/examples/actors/looping.scala | 26 | ||||
-rw-r--r-- | docs/examples/actors/message.scala | 40 | ||||
-rw-r--r-- | docs/examples/actors/pingpong.scala | 61 | ||||
-rw-r--r-- | docs/examples/actors/producers.scala | 114 | ||||
-rw-r--r-- | docs/examples/actors/seq.scala | 15 |
10 files changed, 0 insertions, 585 deletions
diff --git a/docs/examples/actors/auction.scala b/docs/examples/actors/auction.scala deleted file mode 100644 index c3124c67a9..0000000000 --- a/docs/examples/actors/auction.scala +++ /dev/null @@ -1,131 +0,0 @@ -package examples.actors - -import java.util.Date - -import scala.actors._ -import scala.actors.Actor._ - -/** A simple demonstrator program implementing an online auction service - * The example uses the actor abstraction defined in the API of - * package scala.actors. - */ - -trait AuctionMessage -case class Offer(bid: Int, client: Actor) extends AuctionMessage // make a bid -case class Inquire(client: Actor) extends AuctionMessage // inquire status - -trait AuctionReply -case class Status(asked: Int, expiration: Date) // asked sum, expiration date - extends AuctionReply -case object BestOffer extends AuctionReply // yours is the best offer -case class BeatenOffer(maxBid: Int) extends AuctionReply // offer beaten by maxBid -case class AuctionConcluded(seller: Actor, client: Actor) // auction concluded - extends AuctionReply -case object AuctionFailed extends AuctionReply // failed with no bids -case object AuctionOver extends AuctionReply // bidding is closed - -class AuctionActor(seller: Actor, minBid: Int, closing: Date) extends Actor { - val timeToShutdown = 3000 // msec - val bidIncrement = 10 - - def act() { - var maxBid = minBid - bidIncrement - var maxBidder: Actor = null - - loop { - reactWithin (closing.getTime() - new Date().getTime()) { - - case Offer(bid, client) => - if (bid >= maxBid + bidIncrement) { - if (maxBid >= minBid) - maxBidder ! BeatenOffer(bid) - maxBid = bid - maxBidder = client - client ! BestOffer - } - else - client ! BeatenOffer(maxBid) - - case Inquire(client) => - client ! Status(maxBid, closing) - - case TIMEOUT => - if (maxBid >= minBid) { - val reply = AuctionConcluded(seller, maxBidder) - maxBidder ! reply - seller ! reply - } else { - seller ! AuctionFailed - } - reactWithin(timeToShutdown) { - case Offer(_, client) => client ! AuctionOver - case TIMEOUT => exit() - } - - } - } - } -} - -object auction { - - val random = new scala.util.Random - - val minBid = 100 - val closing = new Date(new Date().getTime() + 4000) - - val seller = Actor.actor { } - val auction = new AuctionActor(seller, minBid, closing) - - def client(i: Int, increment: Int, top: Int) = new Actor { - val name = "Client " + i - def log(msg: String) = Console.println(name + ": " + msg) - var max: Int = _ - var current: Int = 0 - def act() { - log("started") - auction ! Inquire(this) - receive { - case Status(maxBid, _) => - log("status(" + maxBid + ")") - max = maxBid - } - loop { - if (max >= top) { - log("too high for me") - } - else if (current < max) { - current = max + increment - Thread.sleep(1 + random.nextInt(1000)) - auction ! Offer(current, this) - } - - reactWithin(3000) { - case BestOffer => - log("bestOffer(" + current + ")") - - case BeatenOffer(maxBid) => - log("beatenOffer(" + maxBid + ")") - max = maxBid - - case AuctionConcluded(seller, maxBidder) => - log("auctionConcluded"); exit() - - case AuctionOver => - log("auctionOver"); exit() - - case TIMEOUT => - exit() - } - } - } - } - - def main(args: Array[String]) { - seller.start() - auction.start() - client(1, 20, 200).start() - client(2, 10, 300).start() - } - -} diff --git a/docs/examples/actors/boundedbuffer.scala b/docs/examples/actors/boundedbuffer.scala deleted file mode 100644 index c65bb7719c..0000000000 --- a/docs/examples/actors/boundedbuffer.scala +++ /dev/null @@ -1,37 +0,0 @@ -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() - } -} diff --git a/docs/examples/actors/channels.scala b/docs/examples/actors/channels.scala deleted file mode 100644 index 3c0dbf232d..0000000000 --- a/docs/examples/actors/channels.scala +++ /dev/null @@ -1,32 +0,0 @@ -package examples.actors - -import scala.actors._ -import scala.actors.Actor._ - -object channels extends Application { - case class Msg(ch1: Channel[Int], ch2: Channel[String]) - - val a = actor { - val Ch1 = new Channel[Int] - val Ch2 = new Channel[String] - - b ! Msg(Ch1, Ch2) - - val ICh1 = Ch1.asInstanceOf[InputChannel[Int]] - val ICh2 = Ch2.asInstanceOf[InputChannel[String]] - - react { - case ICh1 ! (x: Int) => - val r = x + 21 - println("result: "+r) - case ICh2 ! y => - println("received: "+y) - } - } - - val b = actor { - react { - case Msg(ch1, ch2) => ch1 ! 21 - } - } -} diff --git a/docs/examples/actors/fringe.scala b/docs/examples/actors/fringe.scala deleted file mode 100644 index 2026628cb3..0000000000 --- a/docs/examples/actors/fringe.scala +++ /dev/null @@ -1,82 +0,0 @@ -package examples.actors - -import scala.actors.Actor._ -import scala.actors.{Channel, OutputChannel} - -/** - @author Philipp Haller - @version 1.1, 09/21/2007 - */ -object fringe extends Application { - - abstract class Tree - case class Node(left: Tree, right: Tree) extends Tree - case class Leaf(v: Int) extends Tree - - case class CompareFringe(t1: Tree, t2: Tree) - case class ComputeFringe(t1: Tree, atoms: OutputChannel[Option[Leaf]]) - case class Equal(atom1: Option[Leaf], atom2: Option[Leaf]) - case class Extract(tree: Tree) - - val comparator = actor { - val extractor1 = actor(extractorBehavior()) - val extractor2 = actor(extractorBehavior()) - val ch1 = new Channel[Option[Leaf]] - val ch2 = new Channel[Option[Leaf]] - loop { - react { - case CompareFringe(tree1, tree2) => - extractor1 ! ComputeFringe(tree1, ch1) - extractor2 ! ComputeFringe(tree2, ch2) - self ! Equal(ch1.?, ch2.?) - - case Equal(atom1, atom2) => - if (atom1 == atom2) atom1 match { - case None => - println("same fringe") - exit() - case _ => - self ! Equal(ch1.?, ch2.?) - } else { - println("fringes differ") - exit() - } - } - } - } - - val extractorBehavior = () => { - var output: OutputChannel[Option[Leaf]] = null - loop { - react { - case ComputeFringe(tree, leafSink) => - output = leafSink - self ! Extract(tree) - - case Extract(tree) => tree match { - case atom @ Leaf(_) => - output ! Some(atom) - sender ! 'Continue - - case Node(left, right) => - val outer = self - val outerCont = sender - val cont = actor { - react { - case 'Continue => - outer.send(Extract(right), outerCont) - } - } - self.send(Extract(left), cont) - } - - case 'Continue => - output ! None - exit() - } - } - } - - comparator ! CompareFringe(Node(Leaf(5), Node(Leaf(7), Leaf(3))), - Node(Leaf(5), Node(Leaf(7), Leaf(3)))) -} diff --git a/docs/examples/actors/links.scala b/docs/examples/actors/links.scala deleted file mode 100644 index 373e6b07ce..0000000000 --- a/docs/examples/actors/links.scala +++ /dev/null @@ -1,47 +0,0 @@ -package examples.actors - -import scala.actors.{Actor, Exit} -import scala.actors.Actor._ - -object links extends Application { - - case object Stop - - actor { - val start = link(p(2)) - start ! Stop - } - - def p(n: Int): Actor = - if (n == 0) top1() - else top(p(n-1), n) - - def top(a: Actor, n: Int): Actor = actor { - println("starting actor " + n + " (" + self + ")") - self.trapExit = true - link(a) - loop { - receive { - case ex @ Exit(from, reason) => - println("Actor " + n + " received " + ex) - exit('finished) - case any => { - println("Actor " + n + " received " + any) - a ! any - } - } - } - } - - def top1(): Actor = actor { - println("starting last actor" + " (" + self + ")") - receive { - case Stop => - println("Last actor now exiting") - exit('abnormal) - case any => - println("Last actor received " + any) - top1() - } - } -} diff --git a/docs/examples/actors/looping.scala b/docs/examples/actors/looping.scala deleted file mode 100644 index 1ce2e2e5e8..0000000000 --- a/docs/examples/actors/looping.scala +++ /dev/null @@ -1,26 +0,0 @@ -package examples.actors - -import scala.actors.Actor._ - -object looping extends Application { - case object A - - val a = actor { - var cnt = 0 - loop { - react { - case A => - cnt += 1 - if (cnt % 2 != 0) continue - if (cnt < 10) - println("received A") - else { - println("received last A") - exit() - } - } - } - } - - for (i <- 0 until 10) a ! A -} diff --git a/docs/examples/actors/message.scala b/docs/examples/actors/message.scala deleted file mode 100644 index d385543470..0000000000 --- a/docs/examples/actors/message.scala +++ /dev/null @@ -1,40 +0,0 @@ -package examples.actors - -import scala.actors.{Actor, Scheduler} -import scala.actors.Actor._ -import scala.actors.scheduler.SingleThreadedScheduler - -object message { - def main(args: Array[String]) { - val n = try { args(0).toInt } - catch { - case _ => - println("Usage: examples.actors.message <n>") - Predef.exit - } - val nActors = 500 - val finalSum = n * nActors - Scheduler.impl = new SingleThreadedScheduler - - def beh(next: Actor, sum: Int) { - react { - case value: Int => - val j = value + 1; val nsum = sum + j - if (next == null && nsum >= n * j) - println(nsum) - else { - if (next != null) next ! j - if (nsum < n * j) beh(next, nsum) - } - } - } - - def actorChain(i: Int, a: Actor): Actor = - if (i > 0) actorChain(i-1, actor(beh(a, 0))) else a - - val firstActor = actorChain(nActors, null) - var i = n; while (i > 0) { firstActor ! 0; i -= 1 } - - Scheduler.shutdown() - } -} diff --git a/docs/examples/actors/pingpong.scala b/docs/examples/actors/pingpong.scala deleted file mode 100644 index 4ed225c662..0000000000 --- a/docs/examples/actors/pingpong.scala +++ /dev/null @@ -1,61 +0,0 @@ -package examples.actors - -import scala.actors.Actor -import scala.actors.Actor._ - -case object Ping -case object Pong -case object Stop - -/** - * Ping pong example. - * - * @author Philipp Haller - * @version 1.1 - */ -object pingpong extends Application { - val pong = new Pong - val ping = new Ping(100000, pong) - ping.start - pong.start -} - -class Ping(count: Int, pong: Actor) extends Actor { - def act() { - var pingsLeft = count - 1 - pong ! Ping - loop { - react { - case Pong => - if (pingsLeft % 1000 == 0) - println("Ping: pong") - if (pingsLeft > 0) { - pong ! Ping - pingsLeft -= 1 - } else { - println("Ping: stop") - pong ! Stop - exit() - } - } - } - } -} - -class Pong extends Actor { - def act() { - var pongCount = 0 - loop { - react { - case Ping => - if (pongCount % 1000 == 0) - println("Pong: ping "+pongCount) - sender ! Pong - pongCount += 1 - case Stop => - println("Pong: stop") - exit() - } - } - } -} diff --git a/docs/examples/actors/producers.scala b/docs/examples/actors/producers.scala deleted file mode 100644 index 80e5ae33d3..0000000000 --- a/docs/examples/actors/producers.scala +++ /dev/null @@ -1,114 +0,0 @@ -package examples.actors - -import scala.actors.Actor -import scala.actors.Actor._ - -abstract class Producer[T] { - - /** A signal that the next value should be produced. */ - private val Next = new Object - - /** A label for an undefined state of the iterators. */ - private val Undefined = new Object - - /** A signal to stop the coordinator. */ - private val Stop = new Object - - protected def produce(x: T) { - coordinator ! Some(x) - receive { case Next => } - } - - protected def produceValues: Unit - - def iterator = new Iterator[T] { - private var current: Any = Undefined - private def lookAhead = { - if (current == Undefined) current = coordinator !? Next - current - } - - def hasNext: Boolean = lookAhead match { - case Some(x) => true - case None => { coordinator ! Stop; false } - } - - def next: T = lookAhead match { - case Some(x) => current = Undefined; x.asInstanceOf[T] - } - } - - private val coordinator: Actor = actor { - loop { - react { - case Next => - producer ! Next - reply { - receive { case x: Option[_] => x } - } - case Stop => - exit('stop) - } - } - } - - private val producer: Actor = actor { - receive { - case Next => - produceValues - coordinator ! None - } - } -} - -object producers extends Application { - - class Tree(val left: Tree, val elem: Int, val right: Tree) - def node(left: Tree, elem: Int, right: Tree): Tree = new Tree(left, elem, right) - def node(elem: Int): Tree = node(null, elem, null) - - def tree = node(node(node(3), 4, node(6)), 8, node(node(9), 10, node(11))) - - class PreOrder(n: Tree) extends Producer[Int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - produce(n.elem) - traverse(n.left) - traverse(n.right) - } - } - } - - class PostOrder(n: Tree) extends Producer[Int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - traverse(n.left) - traverse(n.right) - produce(n.elem) - } - } - } - - class InOrder(n: Tree) extends Producer[Int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - traverse(n.left) - produce(n.elem) - traverse(n.right) - } - } - } - - actor { - print("PreOrder:") - for (x <- new PreOrder(tree).iterator) print(" "+x) - print("\nPostOrder:") - for (x <- new PostOrder(tree).iterator) print(" "+x) - print("\nInOrder:") - for (x <- new InOrder(tree).iterator) print(" "+x) - print("\n") - } -} diff --git a/docs/examples/actors/seq.scala b/docs/examples/actors/seq.scala deleted file mode 100644 index 816c969cb6..0000000000 --- a/docs/examples/actors/seq.scala +++ /dev/null @@ -1,15 +0,0 @@ -package examples.actors - -object seq extends Application { - import scala.actors.Actor._ - val a = actor { - { react { - case 'A => println("received 1st message") - }; () - } andThen react { - case 'A => println("received 2nd message") - } - } - a ! 'A - a ! 'A -} |