scala.concurrent.DelayedLazyVal
class DelayedLazyVal [ T ] extends AnyRef
A DelayedLazyVal
is a wrapper for lengthy computations which have a valid
partially computed result.
The first argument is a function for obtaining the result at any given point in
time, and the second is the lengthy computation. Once the computation is
complete, the apply
method will stop recalculating it and return a fixed value
from that point forward.
Instance Constructors From scala.concurrent.DelayedLazyVal
new DelayedLazyVal(f: () ⇒ T, body: ⇒ Unit)(implicit exec: ExecutionContext)
f
the function to obtain the current value at any point in time
body
the computation to run to completion in another thread
(defined at scala.concurrent.DelayedLazyVal)
Full Source:
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.concurrent
/** A `DelayedLazyVal` is a wrapper for lengthy computations which have a
* valid partially computed result.
*
* The first argument is a function for obtaining the result at any given
* point in time, and the second is the lengthy computation. Once the
* computation is complete, the `apply` method will stop recalculating it
* and return a fixed value from that point forward.
*
* @param f the function to obtain the current value at any point in time
* @param body the computation to run to completion in another thread
*
* @author Paul Phillips
* @version 2.8
*/
class DelayedLazyVal [ T ]( f : () => T , body : => Unit )( implicit exec : ExecutionContext ){
@volatile private [ this ] var _isDone = false
private [ this ] lazy val complete = f ()
/** Whether the computation is complete.
*
* @return true if the computation is complete.
*/
def isDone = _isDone
/** The current result of f(), or the final result if complete.
*
* @return the current value
*/
def apply () : T = if ( isDone ) complete else f ()
exec . execute ( new Runnable { def run = { body ; _isDone = true } })
}