Add a monad transformer for FutureTry
denisftw opened this issue · 4 comments
Hi!
I needed a FutureTry
transformer and implemented it using your FutureEither
and FutureOption
as examples. If you want, I can submit a pull request with my additions. I think many people would benefit from having FutureTry
as part of the library (I certainly would).
Hi,
Future[Try[_]]
type is not really useful in practice because Future[T] can carry both the a T value and a Throwable, just like Try.
So instead of building a Future[Try[T]]
you can use Future.fromTry
on your Try[T]
to get a Future[T]
:
val f1: Future[Int] = Future.fromTry(Try(1))
val f2: Future[Int] = Future.fromTry(Try(2))
val f3: Future[Int] = for {
v1 <- f1
v2 <- f2
} yield v1 + v2
Does it fit your use case or would you still need a Future[Try] monad transformer?
Hey @loicdescotte !
I agree that the standard Future
can always be selected over Try
as it can do everything that Try
can do and more, but I would still argue that these types have slightly different meanings, and I personally tend to view failed Future
s only as unrecoverable errors. Our current codebase heavily relies on Future[Throwable \/ Something]
and I would very much like to switch from ScalaZ to Hamsters replacing disjunctions with Try
s along the way.
I'm curious, however, what do you use with Play? I'm pretty sure that any sophisticated application will end up dealing with blocking code as well as something breakable. Would you use Future
for both?
@denisftw With Play I'm using Future, and Either type rather than Try.
I understand what you're saying about the need of a Future[Try] usage, if it's useful for you it may certainly be useful for other people, you can send a PR for it :)
Thanks
Loïc
Yeah, I guess using Future[Either]
with some custom error types is the most proper way™, but it also requires a bit more work, so I would settle on Future[Try]
for now. Sending a PR then )