Walkers provide a mechanism for walking through an underlying listish thing, exposed as a "foreach" method.
A late val is a single-assignment val that can be assigned after definition.
A late val is a single-assignment val that can be assigned after definition. Subsequent assignments raise an error, and dereferencing a late val before assignment also raises an error.
val x = new LateVal[Int] ... x.deref // BAD x.assign(3) // Good x.deref // Good x.assign(4) // BAD
A LateVal[X] can be used as an X, via the implicit conversion LateVal. Moreover, the method names LateVal.assign and LateVal.deref are chosen to minimize shadowing whatever methods will be available on X; in particular, LateVal.set and LateVal.get would shadow methods for many common choices of X.
val x = new LateVal[Int] x.assign(3) x + 1
val x = new LateVal[Map[Int, String]] x.assign(Map(1 -> "one")) x.get(1)
Works with "untyped" to make it easier to extract specific things from nested, untyped structures.
Works with "untyped" to make it easier to extract specific things from nested, untyped structures.
Somewhat experimental API; if this proves useful, we'll keep it.
Walkers provide a mechanism for walking through an underlying listish thing, exposed as a "foreach" method. They do not return iterators, nor do they allow random access. This allows them to guarantee post-iteration cleanup actions on the underlying resource, which will occur even if exceptions are thrown while walking.
Walkers can be constructed such that the "foreach" method can only be called once. In that case, subsequent calls should throw an IllegalStateException. Walkers can also be constructed with "foreach" methods that can be called multiple times. In that case, each run should create and then clean up the resource-- saving state across runs is usually counterproductive.