【问题标题】:Convert scala 2.10 future to scalaz.concurrent.Future // Task将 scala 2.10 未来转换为 scalaz.concurrent.Future // 任务
【发布时间】:2013-06-03 11:25:47
【问题描述】:

有没有人来一段代码如何正确地将 scala 的 Future (2.10) 转换为新的 scalaz7 未来?我知道通过 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-contrib 库了吗?那里有some instancesscala.concurrent.Future
  • 感谢您的指出。但是我知道这些是将 scala 期货转换为 scalaz Monad/monoids/semigroups。不确定如何在使用 Tasks/scalaz.Future 的代码中使用它。您能否建议一些代码的小示例,您如何将硬编码任务(即 scalaz-stream)的代码与使用 scala 未来的代码(即 play iteratees)链接起来?

标签: scala scalaz scalaz7


【解决方案1】:

在评估了几个备选方案后,我得出了以下解决方案。显然,如果有人想要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 未来,此解决方案也会运行任务,这可能/可能不需要,具体取决于情况。

【讨论】:

  • 答案开头的链接现在已损坏。
  • 答案开头的固定链接
【解决方案2】:

您还可以使用https://github.com/Verizon/delorean,它添加了方便的toTasktoFuture 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2019-01-11
    • 2013-01-05
    • 2020-03-15
    • 2014-05-23
    • 2020-09-29
    相关资源
    最近更新 更多