package dispatch.futures
import java.util.concurrent.{Executors,Callable,ExecutorService}
object Futures extends AvailableFutures {
type Future[T] = Function0[T] {
def isSet: Boolean
}
}
object DefaultFuture extends JucFuture {
lazy val futureExecutor = Executors.newCachedThreadPool
}
trait AvailableFutures {
def available[T](fs: Iterable[Futures.Future[T]]) = fs filter { _.isSet } map { _() } toList
}
trait Futures {
def future[T](result: => T): Futures.Future[T]
}
trait JucFuture extends Futures {
def future[T](result: => T) = new JucFuture(result)
val futureExecutor: ExecutorService
class JucFuture[T](f: => T) extends Function0[T] {
val delegate = futureExecutor.submit(new Callable[T]{
def call = f
})
def isSet = delegate.isDone
def apply() = delegate.get()
}
}
object ActorsFuture extends Futures {
def future[T](result: => T) = scala.actors.Futures.future(result)
}