Подтвердить что ты не робот

Преобразовать scala 2.10 в будущее в scalaz.concurrent.Future//Задача

Кто-нибудь пришел к кусочку кода, как правильно преобразовать scala Future (2.10) в новое будущее scalaz7? Я знаю, что нужно преобразовать будущее scalaz через scala Promise в 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]=???

потому что это то, что я действительно хочу: -)

4b9b3361

Ответ 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, который добавляет удобные методы toTask и toFuture