Advertisement
Guest User

test futures

a guest
Oct 13th, 2014
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.57 KB | None | 0 0
  1. package chaordic.mailmou.run.test
  2.  
  3. import scala.concurrent.ExecutionContext.Implicits.global
  4. import scala.concurrent.{Await, future, Future}
  5. import scala.concurrent._
  6. import scala.concurrent.duration._
  7.  
  8. object TestFutures { // extends App {
  9.   type Y = () => Future[Widget]
  10.   type K = () => Future[List[Y]]
  11.  
  12.   case class Widget(id: String)
  13.  
  14.   def cache() : K = () => future {
  15.     println("request")
  16.  
  17.     List(
  18.       () => Future.successful(Widget("a")),
  19.       () => Future.successful(Widget("b"))
  20.     )
  21.   }
  22.   def cats() : K = () => {
  23.     future {
  24.       List("catA", "catB", "catC")
  25.     } map { categories => categories map { cat =>
  26.       () => future {
  27.           Widget(cat)
  28.         }
  29.       }
  30.     }
  31.   }
  32.   def fallback() : K = () => Future.successful(List(() => Future.successful(Widget("f")), () => Future.successful(Widget("j"))))
  33.  
  34.   val candidates: List[K] = List(cache(), cats(), fallback())
  35.  
  36.   def findWidgets(candidates: List[K]) : Future[List[Widget]] = {
  37.     val p = Promise[List[Widget]]()
  38.     def getWidgets(list: List[Widget], candidates : List[K], x: List[Y]) : Unit = x match {
  39.       case head :: tail if list.size < 2 => head().map( w => getWidgets(list :+ w, candidates, tail) )
  40.       case _ => getNext(list, candidates)
  41.     }
  42.     def getNext(list: List[Widget], candidates : List[K]) = candidates match {
  43.       case head :: tail if list.size < 2 => head().map(w => getWidgets(list, tail, w))
  44.       case _ => p.success(list)
  45.     }
  46.     getNext(Nil, candidates)
  47.     p.future
  48.   }
  49.  
  50.   findWidgets(candidates).map { i =>
  51.     println("done "+i)
  52.   }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement