Reduza o código da promessa do Play 2.0 com scalaz

Digamos que haja um código como:

def requestAccessToken(code: String): 
Promise[Option[String]] = ...
def requestUserInfo(accessToken: String):
Promise[Option[UserInfo]] = ...
def requestProjects(user: UserInfo):
Promise[Option[Projects]] = ...

def fetchProjects(code: String): Promise[Option[Projects]] =
requestAccessToken
(code).flatMap { tokenOpt =>
tokenOpt
.map { token =>
requestAccessToken
(token).flatMap { userOpt =>
userOpt
.map { user =>
requestProject
(user)
} getOrElse Promise.pure(None)
}
} getOrElse Promise.pure(None)
}

Muitos mapas / flatMaps aninhados, fica ainda mais inchado quando o número de chamadas aumenta.

Mas a promessa é uma mônada!

def fetchProjects(code: String): Promise[Option[UserInfo]] = (for {
accessToken
<- OptionT(requestAccessToken(code))
userInfo
<- OptionT(requestUserInfo(accessToken))
projects
<- OptionT(requestProject(userInfo))
} yield projects).run

Instância Monad do Play se disponível no pacote http://github.com/teamon/play-scalaz