I have a Play! 2 for Scala application that needs to retrieve some data in JSON format from an external service.
The Play! framework allows to make HTTP requests asynchronously by wrapping the response in a Promise. Promise
is a monad that wraps a value that will be available in the future.
This is fine, but in my case what I get from the web service is a JSON string. I have to parse it and the parsing might fail. So I have to wrap whatever I get into an Option
. The result is that many of my methods are returning Promise[Option[Whatever]]
. That is, a value of type Whatever
that will be, maybe, available later.
Now whenever I have to operate over such a value I need to map
it twice. I was thinking of handling this in the following way:
- creating a new type, say
Hope[A]
, that wraps aPromise[Option[A]]
- defining the relevant methods like
map
(or maybe I should useforeach
and inherit from some collection trait?) andflatten
- provide an implicit converter between
Promise[Option[A]]
andHope[A]
.
It is easy to define map
- the composition of two functors is again a functor - and flatten
can be done explicitly in this case, or whenever composing a monad with Option
.
But it is my limited understanding that I do not need to reinvent this stuff: monad transformer exist for exactly this case. Or, well, so I think - I have never used a monad tranformer - and this is the point of the question:
Can monad tranformers be used in this situation? How would I go about actually using them?