Skip to content

Instantly share code, notes, and snippets.

@dbousamra
Created January 13, 2015 20:54
Show Gist options
  • Select an option

  • Save dbousamra/f5f04de9889b87b1acb8 to your computer and use it in GitHub Desktop.

Select an option

Save dbousamra/f5f04de9889b87b1acb8 to your computer and use it in GitHub Desktop.
object Try {
def apply[T](f: => T): Try[T] =
try {
Success(f)
} catch {
case NonFatal(e) => Failure(e)
}
}
sealed trait Try[+T] {
def flatMap[U](f: (T) => Try[U]): Try[U]
def map[U](f: (T) => U): Try[U]
def foreach[U](f: T => U): Unit
def isSuccess: Boolean
def isFailure: Boolean
def getOrElse(f: => T): T = f
}
case class Success[+T](value: T) extends Try[T] {
override def flatMap[U](f: T => Try[U]): Try[U] =
try {
f(value)
} catch {
case NonFatal(e) => Failure(e)
}
override def map[U](f: T => U): Try[U] = Try[U](f(value))
override def foreach[U](f: T => U): Unit = f(value)
override def getOrElse(f: () => T): T = value
override def isSuccess = true
override def isFailure = false
}
case class Failure[T <: Nothing](exception: Throwable) extends Try[T] {
override def flatMap[U](f: (T) => Try[U]): Try[U] = this
override def map[U](f: (T) => U): Try[U] = this
override def foreach[U](f: T => U): Unit = {}
override def isSuccess = false
override def isFailure = true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment