future-ops

所属分类:collect
开发工具:Scala
文件大小:0KB
下载次数:0
上传日期:2020-02-25 09:36:35
上 传 者sh-1993
说明:  操作以简化与Future的编程,
(Operations to ease programming with Future,)

文件列表:
build.sbt (182, 2020-02-25)
src/ (0, 2020-02-25)
src/main/ (0, 2020-02-25)
src/main/scala/ (0, 2020-02-25)
src/main/scala/io/ (0, 2020-02-25)
src/main/scala/io/github/ (0, 2020-02-25)
src/main/scala/io/github/hamsters/ (0, 2020-02-25)
src/main/scala/io/github/hamsters/EmptyValueError.scala (120, 2020-02-25)
src/main/scala/io/github/hamsters/FutureOps.scala (1369, 2020-02-25)
src/test/ (0, 2020-02-25)
src/test/scala/ (0, 2020-02-25)
src/test/scala/io/ (0, 2020-02-25)
src/test/scala/io/github/ (0, 2020-02-25)
src/test/scala/io/github/hamsters/ (0, 2020-02-25)
src/test/scala/io/github/hamsters/FutureOpsSpec.scala (3056, 2020-02-25)

# FutureOps This is a port of Hamsters FutureOps to Scala 2.13. ## Goal Monad stacks are not easy to compose (e.g. in a for comprehension), and if you don't want to use Monad transformers you can use this Future additional methods. ## FutureOps.fromEither ```scala import io.github.hamsters.FutureOps FutureOps.fromEither(Right("a")) //Future("a") FutureOps.fromEither(Left(BoomError)) //Future(BoomError) ``` ## squash Future[Either[Throwable, A]] and Future[Try[A]] You can use `squash` on a `Future[Either[Throwable, A]]` to get a `Future[A]`. ```scala import FutureOps._ abstract class Error(message: String) extends Exception(message) case object BoomError extends Error("Boom") val fea: Future[Either[Error, String]] = Future(Right("a")) val feb: Future[Either[Error, String]] = Future(Left(BoomError)) fea.squash //Future("a") feb.squash //Future(BoomError) ``` You can also `squash` on a `Future[Try[A]]` to get a `Future[A]` in much the same way: ```scala import FutureOps._ val fta: Future[Try[String]] = Future(Success("a")) val ftb: Future[Try[String]] = Future(Failure(new Exception("Boom"))) fta.squash //Future("a") ftb.squash //Future(Exception("Boom")) ``` It can also be useful to compose several `Future[Either[Throwable, _]]` without monad transformers : ```scala def fea: Future[Either[Throwable, Int]] = Future(Right(1)) def feb(a: Int): Future[Either[Throwable, Int]] = Future(Right(a + 2)) val composedAB: Future[Int] = for { a <- fea.squash ab <- feb(a).squash } yield ab composedAB // Future("ab") val error: Either[Throwable, Int] = Left(BoomError) val composedABWithError: Future[Int] = for { a <- Future.successful(error).squash ab <- feb(a).squash } yield ab composedABWithError //Future(Failure(BoomError)) ``` Composing several `Future[Try[_]]`s without monad transformers is also possible: ```scala def fta: Future[Try[Int]] = Future(Success(1)) def ftb(a: Int): Future[Try[Int]] = Future(Success(a + 2)) val composedAB: Future[Int] = for { a <- fta.squash ab <- ftb(a).squash } yield ab composedAB // Future("ab") ``` ## Options Same operations can be used with options : `FutureOps.fromOption` and `squash` on `Future[Option[A]]`. For empty options, an `EmptyValueError` will be raised. # Install Add this to you build.sbt : ```scala resolvers += Resolver.bintrayRepo("loicdescotte", "Hamsters") libraryDependencies += "io.github.scala-hamsters" %% "future-ops" % "1.0.0" ```

近期下载者

相关文件


收藏者