Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. object ReaderMonad {
  2. class Reader[-E, +R] private (g: E => R) {
  3. def apply(env: E): R = g(env)
  4. def map[A](f: R => A): Reader[E, A] = new Reader[E, A](env => f(g(env)))
  5. def flatMap[A, B <: E](f: R => Reader[B, A]): Reader[B, A] = new Reader[B, A](env => f(g(env))(env))
  6. }
  7.  
  8. def pure[E, R](v: R): Reader[E, R] = Reader.pure(v)
  9. def ask[E]: Reader[E, E] = Reader.ask
  10.  
  11. private[this] object Reader {
  12. def pure[E, R](v: R): Reader[E, R] = new Reader[E, R](_ => v)
  13. def ask[E]: Reader[E, E] = new Reader[E, E](identity)
  14. }
  15. }
  16.  
  17. object Main {
  18. import ReaderMonad._
  19.  
  20. case class User(id: Int)
  21.  
  22. trait UserRepository {
  23. def find(id: Int): Option[User]
  24. }
  25.  
  26. object UserRepository extends UserRepository {
  27. private[this] val users = Map(1 -> User(1))
  28. def find(id: Int): Option[User] = users.get(id)
  29. }
  30.  
  31. sealed trait AuthResult
  32. case class Success(user: User) extends AuthResult
  33. case class Failure(message: String) extends AuthResult
  34.  
  35. case class Authenticator(repository: UserRepository) {
  36. def authenticate(username: String, password: String): Reader[Int, AuthResult] = for {
  37. userId <- ask
  38. } yield {
  39. if (isValid(username, password)) {
  40. repository find(userId) map (Success(_)) getOrElse Failure("The user doesn't exist.")
  41. } else {
  42. Failure("Incorrect username or password.")
  43. }
  44. }
  45.  
  46. def isValid(username: String, password: String): Boolean = true
  47. }
  48.  
  49. def main(args: Array[String]): Unit = {
  50. val authenticator = new Authenticator(UserRepository)
  51. val readerForUser1 = authenticator.authenticate("hoge", "")
  52. val readerForUser2 = authenticator.authenticate("fuba", "")
  53.  
  54. println(readerForUser1(1))
  55. println(readerForUser2(2))
  56. }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement