Alexandre Bergeron
Backend Developer @Wajam
@AlexBergeron2
Scala Montreal
March 26th, 2014
def getUsers(): List[User] = {
val c = Database.getConnection()
try {
val rs = c.executeQuery("SELECT * FROM Users")
User.fromResultSet(rs)
} catch {
case t => Nil
} finally {
c.close()
}
}
def getUsers(c: Connection): List[User] = {
try {
val rs = c.executeQuery("SELECT * FROM Users")
User.fromResultSet(rs)
} catch {
case t => Nil
}
}
// Giving a user admin rights
val c = Database.getConnection()
try {
val u = getUserById(id, c)
updateUser(id, u.copy(rights = u.rights + Rights.Admin), c)
} finally {
c.close()
}
implicit val c = Database.getConnection()
try {
val u = getUserById(id)
updateUser(id, u.copy(rights = u.rights + Rights.Admin))
} finally {
c.close()
}

(Monads Tutorial timeline - http://www.haskell.org/haskellwiki/Monad_tutorials_timeline)
(Simplified for the sake of this talk)
map[B](f: A => B): M[B]flatMap[B](f: A => M[B]): M[B]case class Reader[C, A](private run: C => A) {
def apply(c: C): A = run(c)
def map[B](f: A => B): Reader[C, B] =
Reader(c => f(run(c)))
def flatMap[B](f: A => Reader[C, B]): Reader[C, B] =
Reader(c => f(run(c))(c))
}
def getUsers = Reader[Connection, List[User]](c => try {
val rs = c.executeQuery("SELECT * FROM Users")
User.fromResultSet(rs)
} catch {
case t => Nil
})
def getUserById(id: Int): Reader[Connection, User]
def updateUser(id: Int, u: User): Reader[Connection, Unit]
def grantAdmin(id: Int): Reader[Connection, Unit] = {
getUserById(id) flatMap { u =>
updateUser(id, u.copy(rights = u.rights + Rights.Admin))
}
}
// Same Connection passed to getUserById then to grantAdmin
grantAdmin(id)(Database.getConnection())
Thanks for listening
Made with Pandoc, Markdown and reveal.js