diff options
author | Philipp Haller <hallerp@gmail.com> | 2007-07-09 20:14:56 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2007-07-09 20:14:56 +0000 |
commit | b0b847f1ebd3660cc9fe716717d0937a9caa4134 (patch) | |
tree | c4c54a87f7ab759950a9c781f30dfc104707dbf6 /docs/examples/actors/fringe.scala | |
parent | b766a0baf330c46dbab05afc61364e04bb5ffb6c (diff) | |
download | scala-b0b847f1ebd3660cc9fe716717d0937a9caa4134.tar.gz scala-b0b847f1ebd3660cc9fe716717d0937a9caa4134.tar.bz2 scala-b0b847f1ebd3660cc9fe716717d0937a9caa4134.zip |
Added actors example that uses explicit reply d...
Added actors example that uses explicit reply destinations.
Diffstat (limited to 'docs/examples/actors/fringe.scala')
-rw-r--r-- | docs/examples/actors/fringe.scala | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/docs/examples/actors/fringe.scala b/docs/examples/actors/fringe.scala new file mode 100644 index 0000000000..96edd396e9 --- /dev/null +++ b/docs/examples/actors/fringe.scala @@ -0,0 +1,79 @@ +package examples.actors + +import scala.actors.Actor._ +import scala.actors.{Channel, OutputChannel} + +/** + @author Philipp Haller + @version 1.0, 07/09/2007 + */ +object fringe extends Application { + + abstract class Tree + case class Node(left: Tree, right: Tree) extends Tree + case class Leaf(v: Int) extends Tree + + val comparator = actor { + val extractor1 = actor(extractorBehavior()) + val extractor2 = actor(extractorBehavior()) + val ch1 = new Channel[Any] + val ch2 = new Channel[Any] + loop { + react { + case ('Fringe, tree1, tree2) => + extractor1.send(('Fringe, tree1), ch1) + extractor2.send(('Fringe, tree2), ch2) + self ! Triple('Equal, ch1.?, ch2.?) + + case ('Equal, atom1, atom2) => + println("comparing "+atom1+" and "+atom2) + if (atom1 == atom2) atom1 match { + case None => + println("same fringe") + exit() + case _ => + self ! Triple('Equal, ch1.?, ch2.?) + } else { + println("fringes differ") + exit() + } + } + } + } + + val extractorBehavior = () => { + var output: OutputChannel[Any] = null + loop { + react { + case ('Fringe, tree) => + output = sender + self ! ('Extract, tree) + + case ('Extract, tree) => tree match { + case atom @ Leaf(_) => + println("sending "+Some(atom)) + 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 ! ('Fringe, Node(Leaf(5), Node(Leaf(7), Leaf(3))), + Node(Leaf(5), Node(Leaf(7), Leaf(3)))) +} |