package speculation import java.util.concurrent.{ Callable, ExecutorService, Future } class Speculation(val executor: ExecutorService, val mayInterruptIfRunning: Boolean) { def spec[A,B](guess: => A)(f: A => B)(actual: => A): B = { val g = executor.submit(new Callable[A] { def call = guess }) val speculation = executor.submit(new Callable[B] { def call = f(g.get()) }) val a = actual val guessed = g.get() if (a == guessed) { speculation.get() } else { speculation.cancel(mayInterruptIfRunning) f(actual) } } }