Use deferred execution for Sequence.map and Sequence.where

The methods Sequence.map and Sequence.where are now implemented using
deferred execution. They return an instance of a new Sequence-derived
class that performs the operation while iterating. This has three main
advantages:

* It can be computationally cheaper when not the whole sequence is
  iterated.

* It consumes less memory since it does not store the result in a newly
  allocated list.

* They can work on infinite sequences.

Some disadvantages are:

* Iterating the returned iterator will be slightly slower due to
  the added indirection.

* You should be aware that modifications made to the original sequence
  will affect the returned sequence.

* If you need the result in a list, you now need to call Sequence.list
  on the result.
This commit is contained in:
Thorbjørn Lindeijer
2015-03-31 22:25:07 +02:00
parent a7fafce265
commit a8ea2a91a6
9 changed files with 160 additions and 44 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
var a = 1..3
var b = a.where {|x| x > 1 }
var b = a.where {|x| x > 1 }.list
IO.print(b) // expect: [2, 3]
var c = a.where {|x| x > 10 }
var c = a.where {|x| x > 10 }.list
IO.print(c) // expect: []