diff --git a/akka-core/src/main/scala/stm/TransactionalState.scala b/akka-core/src/main/scala/stm/TransactionalState.scala
index e84beaa4f0..9bf4859ee5 100644
--- a/akka-core/src/main/scala/stm/TransactionalState.scala
+++ b/akka-core/src/main/scala/stm/TransactionalState.scala
@@ -62,6 +62,8 @@ trait Committable {
* @author Jonas Bonér
*/
object Ref {
+ type Ref[T] = TransactionalRef[T]
+
def apply[T]() = new Ref[T]
def apply[T](initialValue: T) = new Ref[T](Some(initialValue))
@@ -75,7 +77,7 @@ object Ref {
object TransactionalRef {
/**
- * An implicit conversion that converts an Option to an Iterable value.
+ * An implicit conversion that converts a TransactionalRef to an Iterable value.
*/
implicit def ref2Iterable[T](ref: TransactionalRef[T]): Iterable[T] = ref.toList
@@ -84,14 +86,6 @@ object TransactionalRef {
def apply[T](initialValue: T) = new TransactionalRef[T](Some(initialValue))
}
-/**
- * Implements a transactional managed reference.
- * Alias to TransactionalRef.
- *
- * @author Jonas Bonér
- */
-class Ref[T](initialOpt: Option[T] = None) extends TransactionalRef[T](initialOpt)
-
/**
* Implements a transactional managed reference.
* Alias to Ref.
@@ -99,6 +93,8 @@ class Ref[T](initialOpt: Option[T] = None) extends TransactionalRef[T](initialOp
* @author Jonas Bonér
*/
class TransactionalRef[T](initialOpt: Option[T] = None) extends Transactional {
+ self =>
+
import org.multiverse.api.ThreadLocalTransaction._
implicit val txInitName = "TransactionalRef:Init"
@@ -149,24 +145,36 @@ class TransactionalRef[T](initialOpt: Option[T] = None) extends Transactional {
ref.isNull
}
- def map[B](f: T => B): Option[B] = {
+ def map[B](f: T => B): TransactionalRef[B] = {
ensureIsInTransaction
- if (isEmpty) None else Some(f(ref.get))
+ if (isEmpty) TransactionalRef[B] else TransactionalRef(f(ref.get))
}
- def flatMap[B](f: T => Option[B]): Option[B] = {
+ def flatMap[B](f: T => TransactionalRef[B]): TransactionalRef[B] = {
ensureIsInTransaction
- if (isEmpty) None else f(ref.get)
+ if (isEmpty) TransactionalRef[B] else f(ref.get)
}
- def filter(p: T => Boolean): Option[T] = {
+ def filter(p: T => Boolean): TransactionalRef[T] = {
ensureIsInTransaction
- if (isEmpty || p(ref.get)) Some(ref.get) else None
+ if (isDefined && p(ref.get)) TransactionalRef(ref.get) else TransactionalRef[T]
}
- def foreach(f: T => Unit) {
+ /**
+ * Necessary to keep from being implicitly converted to Iterable in for comprehensions.
+ */
+ def withFilter(p: T => Boolean): WithFilter = new WithFilter(p)
+
+ class WithFilter(p: T => Boolean) {
+ def map[B](f: T => B): TransactionalRef[B] = self filter p map f
+ def flatMap[B](f: T => TransactionalRef[B]): TransactionalRef[B] = self filter p flatMap f
+ def foreach[U](f: T => U): Unit = self filter p foreach f
+ def withFilter(q: T => Boolean): WithFilter = new WithFilter(x => p(x) && q(x))
+ }
+
+ def foreach[U](f: T => U): Unit = {
ensureIsInTransaction
- if (!isEmpty) f(ref.get)
+ if (isDefined) f(ref.get)
}
def elements: Iterator[T] = {