Introduce MapSequence and WhereSequence subclasses of Sequence that apply transformations lazily during iteration instead of building intermediate lists. Update Sequence.map and Sequence.where to return these deferred wrappers, modify all existing tests to call .list on results, and add new infinite-sequence tests verifying lazy behavior on Fibonacci iterators.
41 lines
904 B
Plaintext
41 lines
904 B
Plaintext
// Infinite iterator demonstrating that Sequence.where is not eager
|
|
class FibIterator {
|
|
new {
|
|
_current = 0
|
|
_next = 1
|
|
}
|
|
|
|
iterate {
|
|
var sum = _current + _next
|
|
_current = _next
|
|
_next = sum
|
|
}
|
|
|
|
value { _current }
|
|
}
|
|
|
|
class Fib is Sequence {
|
|
iterate(iterator) {
|
|
if (iterator == null) return new FibIterator
|
|
iterator.iterate
|
|
return iterator
|
|
}
|
|
|
|
iteratorValue(iterator) { iterator.value }
|
|
}
|
|
|
|
var largeFibs = (new Fib).where {|fib| fib > 100 }
|
|
var iterator = null
|
|
|
|
IO.print(largeFibs is Sequence) // expect: true
|
|
IO.print(largeFibs) // expect: instance of WhereSequence
|
|
|
|
iterator = largeFibs.iterate(iterator)
|
|
IO.print(largeFibs.iteratorValue(iterator)) // expect: 144
|
|
|
|
iterator = largeFibs.iterate(iterator)
|
|
IO.print(largeFibs.iteratorValue(iterator)) // expect: 233
|
|
|
|
iterator = largeFibs.iterate(iterator)
|
|
IO.print(largeFibs.iteratorValue(iterator)) // expect: 377
|