2013-06-03 93 views
12

是否有人提供了一段代碼,如何正確地將scala的Future(2.10)轉換爲新的scalaz7未來?我知道熱通過Scala的承諾轉化scalaz未來Scala的未來,但不知道如何做正確周圍將scala 2.10轉換爲scalaz.concurrent.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]=??? 

因爲那就是我真的wa nt :-)

+0

你看到[scalaz-的contrib](https://github.com/typelevel/scalaz-contrib)庫?那裏有'scala.concurrent.Future'的[一些實例](https://github.com/typelevel/scalaz-contrib/blob/master/scala210/main/scala/Future.scala)。 – folone

+0

謝謝指出。但我明白這些是將scala期貨轉換爲斯卡拉Monad/monoids/semigroups。不知道如何在一段使用Tasks/scalaz.Future的代碼中使用它。你能提供一個小例子的代碼,你如何將代碼連接到你已經使用Scala的未來(即循環播放)進行硬編碼的任務(即scalaz-stream)? –

回答

21

經過評估幾個替代方案後,我來到以下解決方案。很明顯,如果有人想要scalaz.Monad[scala.concurrent.Future]scalaz.std.scalaFuturehttps://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) 
    } 

} 

將該溶液但是也可以運行其可以/可以不被期望的,這取決於情況一旦轉換到階將來由該任務。

+4

答案開始處的鏈接現在已被打破。 – jedesah

+0

固定鏈接在答案的開頭 – drstevens