加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

重复eval T => scala.concurrent.Future [T]到一个进程[?,T]

发布时间:2020-12-16 18:05:10 所属栏目:安全 来源:网络整理
导读:我有一个函数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 Pr
我有一个函数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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读