Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package chaordic.mailmou.run.test
- import scala.concurrent.ExecutionContext.Implicits.global
- import scala.concurrent.{Await, future, Future}
- import scala.concurrent._
- import scala.concurrent.duration._
- object TestFutures { // extends App {
- type Y = () => Future[Widget]
- type K = () => Future[List[Y]]
- case class Widget(id: String)
- def cache() : K = () => future {
- println("request")
- List(
- () => Future.successful(Widget("a")),
- () => Future.successful(Widget("b"))
- )
- }
- def cats() : K = () => {
- future {
- List("catA", "catB", "catC")
- } map { categories => categories map { cat =>
- () => future {
- Widget(cat)
- }
- }
- }
- }
- def fallback() : K = () => Future.successful(List(() => Future.successful(Widget("f")), () => Future.successful(Widget("j"))))
- val candidates: List[K] = List(cache(), cats(), fallback())
- def findWidgets(candidates: List[K]) : Future[List[Widget]] = {
- val p = Promise[List[Widget]]()
- def getWidgets(list: List[Widget], candidates : List[K], x: List[Y]) : Unit = x match {
- case head :: tail if list.size < 2 => head().map( w => getWidgets(list :+ w, candidates, tail) )
- case _ => getNext(list, candidates)
- }
- def getNext(list: List[Widget], candidates : List[K]) = candidates match {
- case head :: tail if list.size < 2 => head().map(w => getWidgets(list, tail, w))
- case _ => p.success(list)
- }
- getNext(Nil, candidates)
- p.future
- }
- findWidgets(candidates).map { i =>
- println("done "+i)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement