Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. object MonadicTransformerExample {
  2. import scala.concurrent.ExecutionContext.Implicits.global
  3.  
  4. case class User(id: Int, name: String)
  5. case class Address(user: User)
  6. case class FutureOpt[A](value: Future[Option[A]]) {
  7. def map[B](f: A => B) = {
  8. FutureOpt(value.map(_.map(f)))
  9. }
  10. def flatMap[B](f: A => FutureOpt[B]) = {
  11. FutureOpt(value.flatMap {
  12. case Some(x) => f(x).value
  13. case None => Future.successful(None)
  14. })
  15. }
  16. }
  17.  
  18. val users = Seq(
  19. User(1, "Alex"),
  20. User(2, "Xela"),
  21. User(3, "Katya"),
  22. User(4, "Aytak")
  23. )
  24.  
  25. val addresses = Seq(
  26. Address(users(0)),
  27. Address(users(2))
  28. )
  29.  
  30. def main(args: Array[String]) {
  31.  
  32. def findUserById(id: Long): Future[Option[User]] = {
  33. Future.successful(users.find(_.id == id)) //just mock
  34. }
  35.  
  36. def findAddressByUser(user: User): Future[Option[Address]] = {
  37. Future.successful(addresses.find(_.user == user))
  38. }
  39.  
  40. def findAddressByUserId(id: Int): Future[Option[Address]] = {
  41. val f = for {
  42. user <- FutureOpt(findUserById(id))
  43. address <- FutureOpt(findAddressByUser(user))
  44. } yield address
  45.  
  46. f.value
  47. }
  48.  
  49. import scala.concurrent.duration._
  50. println(Await.result(findAddressByUserId(1), 1 seconds))
  51. println(Await.result(findAddressByUserId(2), 1 seconds))
  52. println(Await.result(findAddressByUserId(3), 1 seconds))
  53. println(Await.result(findAddressByUserId(4), 1 seconds))
  54. }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement