pekko/akka-actor/src/main/scala/akka/util/Helpers.scala

120 lines
2.9 KiB
Scala
Raw Normal View History

2009-03-22 17:26:42 +01:00
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
2009-03-22 17:26:42 +01:00
*/
package akka.util
2009-03-22 17:26:42 +01:00
import akka.event.EventHandler
2009-03-22 17:26:42 +01:00
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
2011-02-28 22:54:32 +01:00
object Helpers {
2009-03-22 17:26:42 +01:00
implicit def null2Option[T](t: T): Option[T] = Option(t)
def intToBytes(value: Int): Array[Byte] = {
val bytes = new Array[Byte](4)
bytes(0) = (value >>> 24).asInstanceOf[Byte]
bytes(1) = (value >>> 16).asInstanceOf[Byte]
bytes(2) = (value >>> 8).asInstanceOf[Byte]
bytes(3) = value.asInstanceOf[Byte]
bytes
}
def bytesToInt(bytes: Array[Byte], offset: Int): Int = {
(0 until 4).foldLeft(0)((value, index) value + ((bytes(index + offset) & 0x000000FF) << ((4 - 1 - index) * 8)))
}
2009-03-22 17:26:42 +01:00
def ignore[E: Manifest](body: Unit) {
try {
body
} catch {
case e if manifest[E].erasure.isAssignableFrom(e.getClass) ()
}
}
def withPrintStackTraceOnError(body: Unit) {
try {
body
} catch {
case e: Throwable
EventHandler.error(e, this, e.toString)
throw e
}
}
/**
* Convenience helper to cast the given Option of Any to an Option of the given type. Will throw a ClassCastException
* if the actual type is not assignable from the given one.
*/
def narrow[T](o: Option[Any]): Option[T] = {
require((o ne null), "Option to be narrowed must not be null!")
o.asInstanceOf[Option[T]]
}
/**
* Convenience helper to cast the given Option of Any to an Option of the given type. Will swallow a possible
* ClassCastException and return None in that case.
*/
def narrowSilently[T: Manifest](o: Option[Any]): Option[T] =
try {
narrow(o)
} catch {
case e: ClassCastException
None
}
2010-10-29 16:33:31 +02:00
/**
* Reference that can hold either a typed value or an exception.
*
* Usage:
* <pre>
* scala> ResultOrError(1)
* res0: ResultOrError[Int] = ResultOrError@a96606
*
* scala> res0()
* res1: Int = 1
*
* scala> res0() = 3
*
* scala> res0()
* res3: Int = 3
2010-10-29 16:33:31 +02:00
*
* scala> res0() = { println("Hello world"); 3}
* Hello world
*
* scala> res0()
* res5: Int = 3
2010-10-29 16:33:31 +02:00
*
* scala> res0() = error("Lets see what happens here...")
*
* scala> res0()
* java.lang.RuntimeException: Lets see what happens here...
2010-10-26 23:44:13 +02:00
* at ResultOrError.apply(Helper.scala:11)
* at .<init>(<console>:6)
* at .<clinit>(<console>)
* at Re...
* </pre>
*/
class ResultOrError[R](result: R) {
private[this] var contents: Either[R, Throwable] = Left(result)
2010-10-29 16:33:31 +02:00
def update(value: R) {
2010-10-29 16:33:31 +02:00
contents = try {
Left(value)
} catch {
case (error: Throwable) Right(error)
2010-10-29 16:33:31 +02:00
}
}
2010-10-29 16:33:31 +02:00
def apply() = contents match {
case Left(result) result
case Right(error) throw error.fillInStackTrace
}
}
object ResultOrError {
def apply[R](result: R) = new ResultOrError(result)
}
}