From ebab76b348014e4965db7b6a43cc95775f80f079 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Fri, 9 Apr 2010 05:17:36 +0800 Subject: [PATCH] Added alter method to TransactionalRef --- akka-core/src/main/scala/stm/TransactionalState.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/akka-core/src/main/scala/stm/TransactionalState.scala b/akka-core/src/main/scala/stm/TransactionalState.scala index 7afb3fb6bb..4949ce389d 100644 --- a/akka-core/src/main/scala/stm/TransactionalState.scala +++ b/akka-core/src/main/scala/stm/TransactionalState.scala @@ -102,6 +102,13 @@ class TransactionalRef[T] extends Transactional { ref.set(elem) } + def alter(f: T => T): T = { + ensureIsInTransaction + ensureNotNull + ref.set(f(ref.get)) + ref.get + } + def get: Option[T] = { ensureIsInTransaction if (ref.isNull) None @@ -171,6 +178,9 @@ class TransactionalRef[T] extends Transactional { private def ensureIsInTransaction = if (getThreadLocalTransaction eq null) throw new NoTransactionInScopeException + + private def ensureNotNull = + if (ref.isNull) throw new RuntimeException("Cannot alter Ref's value when it is null") } object TransactionalMap {