У меня есть некоторые побочные effectful функцию,Есть ли последовательный Future.find?
def f(): Future[Int] = {
val n = Random.nextInt()
println(s"Generated $n")
Future(n)
}
, и я хочу, чтобы выполнить его до тех пор, пока предикат возвращает истину.
def success(n: Int): Boolean = n % 2 == 0
Мой план заключается в создании Stream
результатов
val s = Stream.fill(10)(f)
, а затем использовать Future.find
, чтобы получить первый результат, который удовлетворяет предикату.
Future.find(s)(success) map println
Проблема заключается в том, что Future.find
запускает все фьючерсы параллельно, и я хочу, чтобы выполнить фьючерсы последовательно один за другим до тех пор, пока предикат возвращает истину.
scala> Future.find(s)(success) map println
Generated -237492703
Generated -935476293
Generated -1155819556
Generated -375506595
Generated -912504491
Generated -1307379057
Generated -1522265611
Generated 1163971151
Generated -516152076
res8: scala.concurrent.Future[Unit] = [email protected]
Some(-1155819556)
Вопрос заключается в том, как последовательно выполнять поток фьючерсов, пока предикат не вернет true? Существуют ли подходящие функции в стандартной или сторонней библиотеке?
Возможно, вы посмотрите на 'scalaz-stream' или' iteratee' – jilen
Дубликат для случая std lib. http://stackoverflow.com/questions/26349318/how-to-invoke-a-method-again-and-again-until-it-returns-a-future-value-contain –