Added Sequence.take and Sequence.skip
These lazy iterator producing methods are useful when working with arbitrary sequences and you need to skip or take some number of elements at the start.
This commit is contained in:
@@ -56,6 +56,10 @@ class Sequence {
|
||||
|
||||
map(transformation) { MapSequence.new(this, transformation) }
|
||||
|
||||
skip(count) { SkipSequence.new(this, count) }
|
||||
|
||||
take(count) { TakeSequence.new(this, count) }
|
||||
|
||||
where(predicate) { WhereSequence.new(this, predicate) }
|
||||
|
||||
reduce(acc, f) {
|
||||
@@ -112,6 +116,43 @@ class MapSequence is Sequence {
|
||||
iteratorValue(iterator) { _fn.call(_sequence.iteratorValue(iterator)) }
|
||||
}
|
||||
|
||||
class SkipSequence is Sequence {
|
||||
construct new(sequence, count) {
|
||||
_sequence = sequence
|
||||
_count = count
|
||||
}
|
||||
|
||||
iterate(iterator) {
|
||||
if (iterator) {
|
||||
return _sequence.iterate(iterator)
|
||||
} else {
|
||||
iterator = _sequence.iterate(iterator)
|
||||
var count = _count
|
||||
while (count > 0 && iterator) {
|
||||
iterator = _sequence.iterate(iterator)
|
||||
count = count - 1
|
||||
}
|
||||
return iterator
|
||||
}
|
||||
}
|
||||
|
||||
iteratorValue(iterator) { _sequence.iteratorValue(iterator) }
|
||||
}
|
||||
|
||||
class TakeSequence is Sequence {
|
||||
construct new(sequence, count) {
|
||||
_sequence = sequence
|
||||
_count = count
|
||||
}
|
||||
|
||||
iterate(iterator) {
|
||||
if (!iterator) _taken = 1 else _taken = _taken + 1
|
||||
return _taken > _count ? null : _sequence.iterate(iterator)
|
||||
}
|
||||
|
||||
iteratorValue(iterator) { _sequence.iteratorValue(iterator) }
|
||||
}
|
||||
|
||||
class WhereSequence is Sequence {
|
||||
construct new(sequence, fn) {
|
||||
_sequence = sequence
|
||||
|
||||
@@ -58,6 +58,10 @@ static const char* coreModuleSource =
|
||||
"\n"
|
||||
" map(transformation) { MapSequence.new(this, transformation) }\n"
|
||||
"\n"
|
||||
" skip(count) { SkipSequence.new(this, count) }\n"
|
||||
"\n"
|
||||
" take(count) { TakeSequence.new(this, count) }\n"
|
||||
"\n"
|
||||
" where(predicate) { WhereSequence.new(this, predicate) }\n"
|
||||
"\n"
|
||||
" reduce(acc, f) {\n"
|
||||
@@ -114,6 +118,43 @@ static const char* coreModuleSource =
|
||||
" iteratorValue(iterator) { _fn.call(_sequence.iteratorValue(iterator)) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class SkipSequence is Sequence {\n"
|
||||
" construct new(sequence, count) {\n"
|
||||
" _sequence = sequence\n"
|
||||
" _count = count\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iterate(iterator) {\n"
|
||||
" if (iterator) {\n"
|
||||
" return _sequence.iterate(iterator)\n"
|
||||
" } else {\n"
|
||||
" iterator = _sequence.iterate(iterator)\n"
|
||||
" var count = _count\n"
|
||||
" while (count > 0 && iterator) {\n"
|
||||
" iterator = _sequence.iterate(iterator)\n"
|
||||
" count = count - 1\n"
|
||||
" }\n"
|
||||
" return iterator\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iteratorValue(iterator) { _sequence.iteratorValue(iterator) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class TakeSequence is Sequence {\n"
|
||||
" construct new(sequence, count) {\n"
|
||||
" _sequence = sequence\n"
|
||||
" _count = count\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iterate(iterator) {\n"
|
||||
" if (!iterator) _taken = 1 else _taken = _taken + 1\n"
|
||||
" return _taken > _count ? null : _sequence.iterate(iterator)\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" iteratorValue(iterator) { _sequence.iteratorValue(iterator) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class WhereSequence is Sequence {\n"
|
||||
" construct new(sequence, fn) {\n"
|
||||
" _sequence = sequence\n"
|
||||
|
||||
Reference in New Issue
Block a user