scala - 将 scala 2.10 future 转换为 scalaz.concurrent.Future//任务

标签 scala scalaz scalaz7

有没有人来过一段代码如何正确地将scala的 future (2.10)转换为新的scalaz7 future ?我知道通过 scala Promise 将 scalaz future 转换为 scala Future 很热,但不知道如何正确地做到这一点

例如

import scalaz.concurrent.{Future => Zuture}
import scala.concurrent.Future

我想实现
implicit def scalaF2scalazF[A](in:Future[A]):Zuture[A]=???

那么写起来显然是小菜一碟
implicit def scalaF2scalazTask[A](in:Future[A]):Task[A]=???

因为那是我真正想要的:-)

最佳答案

在评估了几个替代方案后,我得出了以下解决方案。显然,如果有人想要 scalaz.Monad[scala.concurrent.Future] , scalaz.std.scalaFuture https://github.com/scalaz/scalaz/blob/series/7.2.x/core/src/main/scala/scalaz/std/Future.scala#L85是要走的路。

object ScalaFutureConverters {


  implicit def scalaFuture2scalazTask[T](fut: Future[T])(implicit ec: ExecutionContext): Task[T] = {
    Task.async {
      register =>
        fut.onComplete {
          case Success(v) => register(v.right)
          case Failure(ex) => register(ex.left)
        }
    }
  }


  implicit def scalazTask2scalaFuture[T](task: Task[T]): Future[T] = {
    val p: Promise[T] = Promise()

    task.runAsync {
      case -\/(ex) => p.failure(ex)
      case \/-(r) => p.success(r)
    }

    p.future
  }


  implicit class ScalazFutureEnhancer[T](task: Task[T]) {
    def asScala: Future[T] = scalazTask2scalaFuture(task)
  }


  implicit def scalaF2EnhancedScalaF[T](fut: Future[T])(implicit ec: ExecutionContext): ScalaFEnhancer[T] =
    ScalaFEnhancer(fut)(ec)

  case class ScalaFEnhancer[T](fut: Future[T])(implicit ec: ExecutionContext) {
    def asTask: Task[T] = scalaFuture2scalazTask(fut)(ec)
  }

}

然而,一旦转换为 Scala future ,此解决方案也会运行任务,这取决于情况,这可能/可能不需要。

关于scala - 将 scala 2.10 future 转换为 scalaz.concurrent.Future//任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16895635/

相关文章:

scala - 如何将 Akka 库添加到 jupyter-scala 以便我可以在笔记本中使用它?

scala - Akka Streams 按类型拆分流

arrays - 数组仿函数练习

scala - 具有无形状态单子(monad)的状态转换

scala - 在 Scala 中将 Option[T] 转换为 Option[U]

scala - 针对匿名的模式匹配

scala - 为什么 Scalaz 7.1.5 中的 Free 不是 monad 实例?

sql - 使用 Postgres 枚举进行 JDBC 插入

scala - scalaz.Validation loopSuccess和loopFailure如何工作

json - Scalaz 树到 JSON