blob: 361cef1f41b21dbea2762ae96c3100ee129abe2f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
object forceDelay {
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))
}
}
|