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:
+28
-14
@@ -72,21 +72,9 @@ static const char* libSource =
|
||||
" return result\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" map(f) {\n"
|
||||
" var result = new List\n"
|
||||
" for (element in this) {\n"
|
||||
" result.add(f.call(element))\n"
|
||||
" }\n"
|
||||
" return result\n"
|
||||
" }\n"
|
||||
" map(transformation) { new MapSequence(this, transformation) }\n"
|
||||
"\n"
|
||||
" where(f) {\n"
|
||||
" var result = new List\n"
|
||||
" for (element in this) {\n"
|
||||
" if (f.call(element)) result.add(element)\n"
|
||||
" }\n"
|
||||
" return result\n"
|
||||
" }\n"
|
||||
" where(predicate) { new WhereSequence(this, predicate) }\n"
|
||||
"\n"
|
||||
" all(f) {\n"
|
||||
" for (element in this) {\n"
|
||||
@@ -146,6 +134,32 @@ static const char* libSource =
|
||||
" }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class MapSequence is Sequence {\n"
|
||||
" new(seq, f) {\n"
|
||||
" _seq = seq\n"
|
||||
" _f = f\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iterate(n) { _seq.iterate(n) }\n"
|
||||
" iteratorValue(iterator) { _f.call(_seq.iteratorValue(iterator)) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class WhereSequence is Sequence {\n"
|
||||
" new(seq, f) {\n"
|
||||
" _seq = seq\n"
|
||||
" _f = f\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iterate(n) {\n"
|
||||
" while (n = _seq.iterate(n)) {\n"
|
||||
" if (_f.call(_seq.iteratorValue(n))) break\n"
|
||||
" }\n"
|
||||
" return n\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iteratorValue(iterator) { _seq.iteratorValue(iterator) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class String is Sequence {\n"
|
||||
" bytes { new StringByteSequence(this) }\n"
|
||||
"}\n"
|
||||
|
||||
Reference in New Issue
Block a user