summaryrefslogtreecommitdiff
path: root/test/files/presentation/akka/src/akka/routing/Routing.scala
diff options
context:
space:
mode:
Diffstat (limited to 'test/files/presentation/akka/src/akka/routing/Routing.scala')
-rw-r--r--test/files/presentation/akka/src/akka/routing/Routing.scala64
1 files changed, 64 insertions, 0 deletions
diff --git a/test/files/presentation/akka/src/akka/routing/Routing.scala b/test/files/presentation/akka/src/akka/routing/Routing.scala
new file mode 100644
index 0000000000..befc124248
--- /dev/null
+++ b/test/files/presentation/akka/src/akka/routing/Routing.scala
@@ -0,0 +1,64 @@
+/**
+ * Copyright (C) 2009-2011 Scalable Solutions AB <http://scalablesolutions.se>
+ */
+
+package akka.routing
+
+import akka.actor.{ Actor, ActorRef }
+import akka.actor.Actor._
+
+object Routing {
+
+ sealed trait RoutingMessage
+ case class Broadcast(message: Any) extends RoutingMessage
+
+ type PF[A, B] = PartialFunction[A, B]
+
+ /**
+ * Creates a new PartialFunction whose isDefinedAt is a combination
+ * of the two parameters, and whose apply is first to call filter.apply
+ * and then filtered.apply.
+ */
+ def filter[A, B](filter: PF[A, Unit], filtered: PF[A, B]): PF[A, B] = {
+ case a: A if filtered.isDefinedAt(a) && filter.isDefinedAt(a) =>
+ filter(a)
+ filtered(a)
+ }
+
+ /**
+ * Interceptor is a filter(x,y) where x.isDefinedAt is considered to be always true.
+ */
+ def intercept[A, B](interceptor: (A) => Unit, interceptee: PF[A, B]): PF[A, B] =
+ filter({ case a if a.isInstanceOf[A] => interceptor(a) }, interceptee)
+
+ /**
+ * Creates a LoadBalancer from the thunk-supplied InfiniteIterator.
+ */
+ def loadBalancerActor(actors: => InfiniteIterator[ActorRef]): ActorRef =
+ actorOf(new Actor with LoadBalancer {
+ val seq = actors
+ }).start()
+
+ /**
+ * Creates a Dispatcher given a routing and a message-transforming function.
+ */
+ def dispatcherActor(routing: PF[Any, ActorRef], msgTransformer: (Any) => Any): ActorRef =
+ actorOf(new Actor with Dispatcher {
+ override def transform(msg: Any) = msgTransformer(msg)
+ def routes = routing
+ }).start()
+
+ /**
+ * Creates a Dispatcher given a routing.
+ */
+ def dispatcherActor(routing: PF[Any, ActorRef]): ActorRef = actorOf(new Actor with Dispatcher {
+ def routes = routing
+ }).start()
+
+ /**
+ * Creates an actor that pipes all incoming messages to
+ * both another actor and through the supplied function
+ */
+ def loggerActor(actorToLog: ActorRef, logger: (Any) => Unit): ActorRef =
+ dispatcherActor({ case _ => actorToLog }, logger)
+}