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

2024-03-24

有人找到了如何将 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 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,该解决方案也会运行该任务,这可能是/可能不是需要的,具体取决于情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 scala 2.10 future 转换为 scalaz.concurrent.Future // 任务 的相关文章

随机推荐