Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/vm/wren_core.wren
Original file line number Diff line number Diff line change
Expand Up @@ -169,16 +169,25 @@ class WhereSequence is Sequence {
construct new(sequence, fn) {
_sequence = sequence
_fn = fn
_cache_val = null
_cache_iter = null
}

iterate(iterator) {
while (iterator = _sequence.iterate(iterator)) {
if (_fn.call(_sequence.iteratorValue(iterator))) break
var val = _sequence.iteratorValue(iterator)
if (_fn.call(val)) {
_cache_val = val
_cache_iter = iterator
break
}
}
return iterator
}

iteratorValue(iterator) { _sequence.iteratorValue(iterator) }
iteratorValue(iterator) {
if (iterator == _cache_iter) return _cache_val else return _sequence.iteratorValue(iterator)
}
}

class String is Sequence {
Expand Down
13 changes: 11 additions & 2 deletions src/vm/wren_core.wren.inc
Original file line number Diff line number Diff line change
Expand Up @@ -171,16 +171,25 @@ static const char* coreModuleSource =
" construct new(sequence, fn) {\n"
" _sequence = sequence\n"
" _fn = fn\n"
" _cache_val = null\n"
" _cache_iter = null\n"
" }\n"
"\n"
" iterate(iterator) {\n"
" while (iterator = _sequence.iterate(iterator)) {\n"
" if (_fn.call(_sequence.iteratorValue(iterator))) break\n"
" var val = _sequence.iteratorValue(iterator)\n"
" if (_fn.call(val)) {\n"
" _cache_val = val\n"
" _cache_iter = iterator\n"
" break\n"
" }\n"
" }\n"
" return iterator\n"
" }\n"
"\n"
" iteratorValue(iterator) { _sequence.iteratorValue(iterator) }\n"
" iteratorValue(iterator) {\n"
" if (iterator == _cache_iter) return _cache_val else return _sequence.iteratorValue(iterator)\n"
" }\n"
"}\n"
"\n"
"class String is Sequence {\n"
Expand Down