私はasyncEverywhere
メソッドを記述した場合、私はそれに渡された異なる機能で、二回everywhere
を呼び出します。
最初のものは、副作用の同一性関数です。 副作用として適切なFuture
を開始し、それを変更可能なリストに追加します。 トラバーサルの最初のパスが完了すると、私はFuture
のリストを取得します。
Future.sequence
と呼ぶと、Future
のリストに変換できます。このFuture
のmap
を呼び出して、 の方法でリストを変換します。 - 私はTree
のeverywhere
を別の機能で呼び出します。その2番目の関数は、左から順に、その結果をリストから抜き出します(これは変更可能なリストです)。リストのサイズは処理される要素の数と一致するためです。
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.language.postfixOps
def asyncEverywhere[T](asyncF: T => Future[T], tree: Tree[T])
(implicit ec: ExecutionContext) = {
val queue = scala.collection.mutable.Queue[Future[T]]()
object enqueueFutures extends ->({ (i: T) =>
queue.enqueue(asyncF(i))
i
})
everywhere(enqueueFutures)(tree)
Future.sequence(queue) map { q =>
object dispenseResults extends (T -> T)(_ => q.dequeue())
everywhere(dispenseResults)(tree)
}
}
println(Await.result(
asyncEverywhere(
(i: Int) => Future { i + 1 },
tree),
1 minute))
:ここ
はそのように見えることができる方法です