class ErrRef[S](s : S){
private[this] var contents : Either[Throwable, S] = Right(s);
def update(value : =>S){
contents = try { Right(value) }
catch { case (e : Throwable) => Left(e) }
}
def apply() = contents match {
case Right(s) => s;
case Left(e) => throw e.fillInStackTrace();
}
}
object ER{
def apply[S](s : S) = new ErrRef(s);
} |
class ErrRef[S](s : S){
private[this] var contents : Either[Throwable, S] = Right(s);
def update(value : =>S){
contents = try { Right(value) }
catch { case (e : Throwable) => Left(e) }
}
def apply() = contents match {
case Right(s) => s;
case Left(e) => throw e.fillInStackTrace();
}
}
object ER{
def apply[S](s : S) = new ErrRef(s);
}
And using it…
scala> ER(1)
res0: ErrRef[Int] = ErrRef@a96606
scala> res0()
res1: Int = 1
scala> res0() = 3
scala> res0()
res3: Int = 3
scala> res0() = { println("Hello world"); 3}
Hello world
scala> res0()
res5: Int = 3
scala> res0() = error("Lets see what happens here...")
scala> res0()
java.lang.RuntimeException: Lets see what happens here...
at ErrRef.apply(RefExcept.scala:11)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:3)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc...
scala> res0() = throw new IllegalArgumentException("Go away")
scala> res0()
java.lang.IllegalArgumentException: Go away
at ErrRef.apply(RefExcept.scala:11)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:3)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorI... |
scala> ER(1)
res0: ErrRef[Int] = [email protected]
scala> res0()
res1: Int = 1
scala> res0() = 3
scala> res0()
res3: Int = 3
scala> res0() = { println("Hello world"); 3}
Hello world
scala> res0()
res5: Int = 3
scala> res0() = error("Lets see what happens here...")
scala> res0()
java.lang.RuntimeException: Lets see what happens here...
at ErrRef.apply(RefExcept.scala:11)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:3)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc...
scala> res0() = throw new IllegalArgumentException("Go away")
scala> res0()
java.lang.IllegalArgumentException: Go away
at ErrRef.apply(RefExcept.scala:11)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:3)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorI...
This could just just a hint more explanation.
Combining “update” with pass-by-name! Also an elegant user of Either. Cool.
Ian: Nah, not really.