diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-08-30 15:46:29 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-09-02 08:58:33 +0900 |
| commit | 66211394e1597e403f14aada81a993f5b1429066 (patch) | |
| tree | 105373cb13dccf72c8fcd90a496a21c1da9b5b5f /mrbgems/mruby-enum-chain/mrblib | |
| parent | 0ce1878abafcaa84e373de144480aaadfff3039b (diff) | |
| download | mruby-66211394e1597e403f14aada81a993f5b1429066.tar.gz mruby-66211394e1597e403f14aada81a993f5b1429066.zip | |
`Enumerator::Chain#rewind` shouldn't rewind elements aren't iterated
### Example:
```ruby
# example.rb
e = [1]
def e.rewind; p :r end
c = e.chain(e)
c.each{break c}.rewind
```
#### Before this patch:
```terminal
$ bin/mruby example.rb
:r
:r
```
#### After this patch (same as Ruby):
```terminal
$ bin/mruby example.rb
:r
```
Diffstat (limited to 'mrbgems/mruby-enum-chain/mrblib')
| -rw-r--r-- | mrbgems/mruby-enum-chain/mrblib/chain.rb | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/mrbgems/mruby-enum-chain/mrblib/chain.rb b/mrbgems/mruby-enum-chain/mrblib/chain.rb index 55474eb92..43d0926c8 100644 --- a/mrbgems/mruby-enum-chain/mrblib/chain.rb +++ b/mrbgems/mruby-enum-chain/mrblib/chain.rb @@ -17,13 +17,19 @@ class Enumerator include Enumerable def initialize(*args) - @enums = args + @enums = args.freeze + @pos = -1 end def each(&block) - return to_enum unless block_given? + return to_enum unless block - @enums.each { |e| e.each(&block) } + i = 0 + while i < @enums.size + @pos = i + @enums[i].each(&block) + i += 1 + end self end @@ -36,11 +42,10 @@ class Enumerator end def rewind - i = @enums.size - 1 - while 0 <= i - e = @enums[i] + while 0 <= @pos && @pos < @enums.size + e = @enums[@pos] e.rewind if e.respond_to?(:rewind) - i -= 1 + @pos -= 1 end self |
