2013-06-03 18 views
12

qualcuno è giunto a un pezzo di codice su come convertire correttamente il futuro di scala (2.10) in un nuovo futuro di scalaz7? So hot convertire futuro scalaz Via Scala Promessa di scala futuro, ma non sapete come farlo correttamente intornoConverti scala 2.10 in futuro in scalaz.concurrent.Future // Task

Per esempio

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

voglio avere attuazione

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

Poi ovviamente sarebbe un pezzo di torta per scrivere

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

perché questo è quello che veramente wa nt :-)

+0

Hai visto la [contrib scalaz-] (https://github.com/typelevel/scalaz-contrib) biblioteca? Ci sono [alcune istanze] (https://github.com/typelevel/scalaz-contrib/blob/master/scala210/main/scala/Future.scala) per 'scala.concurrent.Future' lì. – folone

+0

Grazie per la segnalazione. Comunque ho capito che questi sono per convertire i futures su scala in Monade/Monarch/semigruppi scalaz. Non sei sicuro di come possa essere usato in un pezzo di codice che utilizza Tasks/scalaz.Future. Potete per favore suggerire un piccolo esempio di codice su come collegare il codice in cui avete task hardcoded (ad es. Scalaz-stream) con uno che usa il futuro di scala (ad esempio, iteratees di gioco)? –

risposta

21

Dopo aver valutato un paio di alternative sono giunto alla seguente soluzione. Ovviamente se qualcuno vuole 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 è la strada da percorrere.

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) 
    } 

} 

Questa soluzione però corre anche il compito una volta che la conversione in futuro scala è fatto che può/non può essere desiderato, a seconda della situazione.

+4

Il link all'inizio della risposta è ora rotto. – jedesah

+0

collegamento fisso all'inizio della risposta – drstevens