6

Weak as in weak references. Basically, I need a sequence of numbers where some of them can be unallocated when they aren't needed anymore.

Anonymous
  • 821
  • 1
  • 5
  • 14

3 Answers3

5

scalaz.EphemeralStream is what you want.

Apocalisp
  • 34,834
  • 8
  • 106
  • 155
0

Views provide you with a lazy collection, where each value is computed as it is needed.

Bradford
  • 4,143
  • 2
  • 34
  • 44
  • Yes. I already have a lazy collection (Stream), but I need it to be weak too. – Anonymous Mar 27 '11 at 21:22
  • The whole point of the question... gotcha! Thanks. I'll leave my answer here for others to see these comments. Can someone perhaps explain why Views are not weak? – Bradford Mar 27 '11 at 21:33
  • 2
    The distinction is that views do not cache computed elements at all, while a weak stream will cache its elements until they are garbage collected. – Aaron Novstrup Mar 28 '11 at 03:37
0

One thing you could do is create an Iterable instead of a Stream. Your Iterable needs to provide an iterator method, which returns an iterator with hasNext and next methods.

When you loop over the Iterable, hasNext and next will be called to generate the elements as they are needed, but they are not stored anywhere (like a Stream does).

Simple example:

class Numbers extends Iterable[Int] {
  def iterator = new Iterator[Int] {
    private var num = -1

    def hasNext = num < 99
    def next = { num += 1; num }
  }
}
Jesper
  • 202,709
  • 46
  • 318
  • 350
  • That wouldn't help much, because I need a stream for two reasons: functional programming (= not iterators) and memoization (not iterables). – Anonymous Mar 28 '11 at 22:50
  • @Anonymous - note that `Iterable` has most Scala collection methods (including `foreach`, `map`, `filter`, `foldLeft` etc) so you can use it for func programming just like any other collection, and memoization: I thought you wanted something that does *not* retain the generated values? – Jesper Mar 29 '11 at 11:03
  • It should retain them, just not permanent. Look at (I think) java.lang.ref.WeakReference. – Anonymous Mar 29 '11 at 12:29