Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- *
- * The classic use of Readers is to build programs that accept a configuration as a
- * parameter. Let’s ground this with a complete example of a simple login system.
- * Our configuration will consist of two databases: a list of valid users and a
- * list of their passwords:
- */
- case class Db(usernames: Map[Int, String],
- passwords: Map[String, String]
- )
- type DbReader[A] = Reader[Db, A]
- def findUsername(userId: Int): DbReader[Option[String]] = Reader(_.usernames.get(userId))
- def checkPassword(username: String,
- password: String): DbReader[Boolean] =
- Reader(_.passwords.get(username).contains(password))
- import cats.syntax.applicative._ // for pure
- def checkLogin(userId: Int,
- password: String): DbReader[Boolean] =
- for {
- maybeUsername <- findUsername(userId)
- passwordOk <- maybeUsername match {
- case Some(u) => checkPassword(u, password)
- case None => false.pure[DbReader]
- }
- } yield passwordOk
- val users = Map(
- 1 -> "dade",
- 2 -> "kate",
- 3 -> "margo"
- )
- val passwords = Map(
- "dade" -> "zerocool",
- "kate" -> "acidburn",
- "margo" -> "secret"
- )
- val db = Db(users, passwords)
- checkLogin(1, "zerocool").run(db)
- // res10: cats.Id[Boolean] = true
- checkLogin(4, "davinci").run(db)
- // res11: cats.Id[Boolean] = false
Add Comment
Please, Sign In to add comment