我有一个函数get:T =>
scala.concurrent.Future [T]
我想迭代它像:
val futs: Iterator[Future[T]] = Iterator.iterate(get(init)){ _.flatMap(prev => get(prev)) }
但Iterator的类型是Future [T],处理这个迭代器并不容易.
How could I transfer that to
Process[?,T]
(也许T => Future [T]作为上下文类型F).
解决方法
不是超级好的解决方案,但有效
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{Future => SFuture} import scala.language.implicitConversions import scalaz.concurrent.Task import scalaz.stream._ implicit class Transformer[+T](fut: => SFuture[T]) { def toTask(implicit ec: scala.concurrent.ExecutionContext): Task[T] = { import scala.util.{Success,Failure} import scalaz.Syntax.either._ Task.async { register => fut.onComplete { case Success(v) => register(v.right) case Failure(ex) => register(ex.left) } } } } val init: Int = 0 def f(i: Int): SFuture[Int] = SFuture(i + 1) val p = Process.repeatEval[Task,Int] { var prev = init f(prev).toTask.map(next => {prev = next; next}) } println(p.take(10).runLog.run)