aboutsummaryrefslogtreecommitdiff
path: root/scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-03-02 12:06:03 +0100
committerJakob Odersky <jodersky@gmail.com>2013-03-02 12:06:03 +0100
commit494b80da610fe2b4cb1790ae237437a17ac6ef62 (patch)
treed36b5ed810851198a21de640128631c9846a4835 /scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala
parent5b00baec28e8e7976636df86f30bc3a6412f8203 (diff)
downloadace-494b80da610fe2b4cb1790ae237437a17ac6ef62.tar.gz
ace-494b80da610fe2b4cb1790ae237437a17ac6ef62.tar.bz2
ace-494b80da610fe2b4cb1790ae237437a17ac6ef62.zip
simplify scala implementation
Diffstat (limited to 'scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala')
-rw-r--r--scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala38
1 files changed, 38 insertions, 0 deletions
diff --git a/scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala b/scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala
new file mode 100644
index 0000000..9d426d3
--- /dev/null
+++ b/scala/ace/src/main/scala/com/github/jodersky/ace/ReactiveLayer.scala
@@ -0,0 +1,38 @@
+package com.github.jodersky.ace
+
+import scala.concurrent.Future
+
+/** Represents a layer in a reactive protocol.
+ * @tparam L data type this layer receives from or writes to a lower layer
+ * @tparam T data type this layer sends to a higher layer or receives from a higher */
+trait ReactiveLayer[L, T] {
+ private var lowerLayer: Option[ReactiveLayer[_, L]] = None
+ private var higherLayer: Option[ReactiveLayer[T, _]] = None
+
+ /** Notifies a higher layer that data is available. */
+ protected def notifyHigher(data: T): Unit = higherLayer match {
+ case Some(higher) => higher.receive(data)
+ case None => throw new UnsupportedOperationException("Higher layer doesn't exist.")
+ }
+
+ /** Sends data to a lower layer. */
+ protected def sendToLower(l: L): Future[L] = lowerLayer match {
+ case Some(lower) => lower.send(l)
+ case None => Future.failed(new UnsupportedOperationException("Lower layer doesn't exist."))
+ }
+
+ /** Connects this layer with a higher layer, effectively linking calls
+ * `notifyHigher` to `higher.receive` and `higher.sendToLower` to `send`. */
+ def connect[A](higher: ReactiveLayer[T, A]) = {
+ this.higherLayer = Some(higher)
+ higher.lowerLayer = Some(this)
+ higher
+ }
+
+ /** Called from lower layer. */
+ protected def receive(data: L): Unit
+
+ /** Send data to this layer.
+ * @return a future value containing the data sent, or an error */
+ def send(data: T): Future[T]
+} \ No newline at end of file