Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Syncronous Scala Future without separate thread

I'm building a library that, as part of its functionality, makes HTTP requests. To get it to work in the multiple environments it'll be deployed in I'd like it to be able to work with or without Futures.

One option is to have the library parametrise the type of its response so you can create an instance of the library with type Future, or an instance with type Id, depending on whether you are using an asynchronous HTTP implementation. (Id might be an Identity monad - enough to expose a consistent interface to users)

I've started with that approach but it has got complicated. What I'd really like to do instead is use the Future type everywhere, boxing synchronous responses in a Future where necessary. However, I understand that using Futures will always entail some kind of threadpool. This won't fly in e.g. AppEngine (a required environment).

Is there a way to create a Future from a value that will be executed on the current thread and thus not cause problems in environments where it isn't possible to spawn threads?

(p.s. as an additional requirement, I need to be able to cross build the library back to Scala v2.9.1 which might limit the features available in scala.concurrent)

like image 900
adamnfish Avatar asked Oct 04 '22 09:10

adamnfish


2 Answers

From what I understand you wish to execute something and then wrap the result with Future. In that case, you can always use Promise

val p = Promise[Int]
p success 42
val f = p.future

Hence you now have a future wrapper containing the final value 42

Promise is very well explained here .

like image 163
Jatin Avatar answered Oct 12 '22 06:10

Jatin


Take a look at Scalaz version of Future trait. That's based on top of Trampoline mechanism which will be executing by the current thread unless fork or apply won't be called + that completely removes all ExecutionContext imports =)

like image 36
4lex1v Avatar answered Oct 12 '22 06:10

4lex1v