blob: 84a224a40a91c48b91bdfb5da955cc17d3e19e4e (
plain) (
tree)
|
|
object forceDelay {
import scala.language.implicitConversions
class Susp[+A](lazyValue: => A) extends Function0[A] {
private var func: () => Any = () => lazyValue
private var value: Any = null
override def apply() = {
if (func != null) {
value = func().asInstanceOf[A]
func = null
}
value.asInstanceOf[A]
}
override def toString() =
if (func == null) "Susp(" + value + ")"
else "Susp(?)"
}
def delay[A](value: => A) = new Susp[A](value)
implicit def force[A](s: Susp[A]): A = s()
}
object Test {
import forceDelay._
def main(args: Array[String]) = {
val s: Susp[Int] = delay { Console.println("evaluating..."); 3 }
Console.println("s = " + s)
Console.println("s() = " + s())
Console.println("s = " + s)
Console.println("2 + s = " + (2 + s))
}
}
|