Advertisement
Guest User

Untitled

a guest
May 4th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. package core.liststate
  2.  
  3. import java.util.UUID
  4.  
  5. import com.google.inject.Inject
  6. import models.Tables
  7. import services.ListStatesDataService
  8.  
  9. import scala.concurrent.Future
  10. import scala.language.higherKinds
  11.  
  12. class ListStateService @Inject()(stateService: ListStatesDataService) {
  13.  
  14. // import FunctorImplicits._
  15. // private def toListState[A <: Tables.ListStatesRow, F[_]: Functor[F]](given: F[A]): F[ListState] =
  16. // implicitly[Functor[F]].map(given)(a => ListState.apply(a))
  17.  
  18. import DoubleMappableImplicits._
  19. private def makeListStatesFrom[A <: Tables.ListStatesRow, T[_]: DoubleMappable[Future, T]](futureDbResult: Future[T[A]]) =
  20. implicitly[DoubleMappable[Future, T]].map[A, ListState](futureDbResult)((row: A) => ListState.apply(row))
  21.  
  22. // def findById(id: UUID): Future[Option[ListState]] = stateService.select(id).map(row => toListState(row))
  23. def findById(id: UUID): Future[Option[ListState]] = makeListStatesFrom(stateService.select(id))
  24.  
  25. // def findMany(ids: Set[UUID]): Future[Seq[ListState]] = stateService.selectMany(ids).map(row => toListState(row))
  26. def findMany(ids: Set[UUID]): Future[Seq[ListState]] = makeListStatesFrom(stateService.selectMany(ids))
  27. }
  28.  
  29. object FunctorImplicits {
  30.  
  31. import scala.language.higherKinds
  32.  
  33. trait Functor[F[_]] {
  34. def map[A, B](a: F[A])(f: A => B): F[B]
  35. }
  36.  
  37. implicit object OptionAsFunctor extends Functor[Option] {
  38. override def map[A, B](a: Option[A])(f: (A) => B): Option[B] = a.map(f)
  39. }
  40.  
  41. implicit object SeqAsFunctor extends Functor[Seq] {
  42. override def map[A, B](a: Seq[A])(f: (A) => B): Seq[B] = a.map(f)
  43. }
  44.  
  45. }
  46.  
  47.  
  48. object DoubleMappableImplicits {
  49.  
  50. import scala.language.higherKinds
  51.  
  52. trait DoubleMappable[OUTER[_] , INNER[_]] {
  53. def map[A, B](a: OUTER[INNER[A]])(f: (A) => B): OUTER[INNER[B]]
  54. }
  55.  
  56. implicit object FutureOptionAsDoubleMappable extends DoubleMappable[Future, Option] {
  57. override def map[A, B](a: Future[Option[A]])(f: (A) => B): Future[Option[B]] = a.map(o => o.map(f))
  58. }
  59.  
  60. implicit object FutureSeqAsDoubleMappable extends DoubleMappable[Future, Seq] {
  61. override def map[A, B](a: Future[Seq[A]])(f: (A) => B): Future[Seq[B]] = a.map(o => o.map(f))
  62. }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement