2013-06-03 2 views
12

誰かがスケーラの未来(2.10)を新しいscalaz7 futureに正しく変換する方法を知りましたか?私はその後、私はscala2.10の未来をscalaz.concurrent.Futureに変換する//

implicit def scalaF2scalazF[A](in:Future[A]):Zuture[A]=??? 

の実装を持ちたい

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

例えば

の周りにそれを正しく行う方法がわからないScalaの未来にScalaの約束を経由してscalaz未来を変換する熱い知っているが、明らかに書き込みするケーキの一部になります

implicit def scalaF2scalazTask[A](in:Future[A]):Task[A]=??? 

これは私が本当に何をしているのでnt :-)

+0

を追加したhttps://github.com/Verizon/deloreanを使用することができますが、[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

指摘していただきありがとうございます。しかし、スカラのMonad/monoids/semigroupsにスカラ先物を変換することを理解しました。これがTasks/scalaz.Futureを使用するコードでどのように使用されるかは不明です。あなたは、タスク(すなわちscalaz-stream)をscalaの未来を使うもの(すなわちiterateesを再生するもの)とハードコードしたコードをリンクする方法を、小さなコード例としてお勧めしますか? –

答えて

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

0

あなたは、便利なtoTasktoFuture方法