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