diff options
author | cchantep <chantepie@altern.org> | 2014-10-29 17:25:01 +0100 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2015-04-07 16:28:43 -0700 |
commit | f10dcc76dff4aa9146cd1ec4052fe136f597a260 (patch) | |
tree | 80a69dfd9ddf9b4f246d1b475c832825de0c9eb5 /src/library | |
parent | 293625e7bb685514ce82a0400bbd7ba5708d6553 (diff) | |
download | scala-f10dcc76dff4aa9146cd1ec4052fe136f597a260.tar.gz scala-f10dcc76dff4aa9146cd1ec4052fe136f597a260.tar.bz2 scala-f10dcc76dff4aa9146cd1ec4052fe136f597a260.zip |
SI-8336: add `fold` & `toEither` to `util.Try`
`res.fold(fa, fb)` evaluates to `fa(e)` if `res` is a `Failure(e)`,
or `fb(value)` if `res` is a `Success(value)`.
(If `fb` throws an exception `e` when applied, `fa(e)`.)
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/util/Try.scala | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/library/scala/util/Try.scala b/src/library/scala/util/Try.scala index 1e6ae6c591..c807677119 100644 --- a/src/library/scala/util/Try.scala +++ b/src/library/scala/util/Try.scala @@ -174,6 +174,31 @@ sealed abstract class Try[+T] extends Product with Serializable { * `s` if this is a `Success`. */ def transform[U](s: T => Try[U], f: Throwable => Try[U]): Try[U] + + /** + * Returns `Left` with `Throwable` if this is a `Failure`, otherwise returns `Right` with `Success` value. + */ + def toEither: Either[Throwable, T] + + /** + * Applies `fa` if this is a `Failure` or `fb` if this is a `Success`. + * If `fb` is initially applied and throws an exception, + * then `fa` is applied with this exception. + * + * @example {{{ + * val result: Try[Throwable, Int] = Try { string.toInt } + * log(result.fold( + * ex => "Operation failed with " + ex, + * v => "Operation produced value: " + v + * )) + * }}} + * + * @param fa the function to apply if this is a `Failure` + * @param fb the function to apply if this is a `Success` + * @return the results of applying the function + */ + def fold[U](fa: Throwable => U, fb: T => U): U + } object Try { @@ -208,6 +233,8 @@ final case class Failure[+T](exception: Throwable) extends Try[T] { try { if (pf isDefinedAt exception) pf(exception) else this } catch { case NonFatal(e) => Failure(e) } override def failed: Try[Throwable] = Success(exception) override def toOption: Option[T] = None + override def toEither: Either[Throwable, T] = Left(exception) + override def fold[U](fa: Throwable => U, fb: T => U): U = fa(exception) } @@ -236,4 +263,7 @@ final case class Success[+T](value: T) extends Try[T] { override def recoverWith[U >: T](@deprecatedName('f) pf: PartialFunction[Throwable, Try[U]]): Try[U] = this override def failed: Try[Throwable] = Failure(new UnsupportedOperationException("Success.failed")) override def toOption: Option[T] = Some(value) + override def toEither: Either[Throwable, T] = Right(value) + override def fold[U](fa: Throwable => U, fb: T => U): U = + try { fb(value) } catch { case NonFatal(e) => fa(e) } } |