Skip to content

Commit

Permalink
Merge pull request #644 from ivoanjo/fix-map-enumerator
Browse files Browse the repository at this point in the history
Fix Map#each and #each_pair not returning enumerator outside of MRI
  • Loading branch information
pitr-ch committed Apr 2, 2017
2 parents df52663 + 0bdc3c0 commit 8912af0
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 1 deletion.
Expand Up @@ -95,7 +95,6 @@ def clear
end

def each_pair
return enum_for :each_pair unless block_given?
dupped_backend.each_pair do |k, v|
yield k, v
end
Expand Down
5 changes: 5 additions & 0 deletions lib/concurrent/map.rb
Expand Up @@ -171,6 +171,11 @@ def each_value
each_pair {|k, v| yield v}
end unless method_defined?(:each_value)

def each_pair
return enum_for :each_pair unless block_given?
super
end

alias_method :each, :each_pair unless method_defined?(:each)

def key(value)
Expand Down
16 changes: 16 additions & 0 deletions spec/concurrent/collection_each_shared.rb
Expand Up @@ -42,4 +42,20 @@
end
end
end

context 'when no block is given' do
it 'returns an enumerator' do
@cache[:a] = 1
@cache[:b] = 2

expect(@cache.send(method)).to be_a Enumerator
end

it 'returns an object which is enumerable' do
@cache[:a] = 1
@cache[:b] = 2

expect(@cache.send(method).to_a).to contain_exactly([:a, 1], [:b, 2])
end
end
end
4 changes: 4 additions & 0 deletions spec/concurrent/map_spec.rb
Expand Up @@ -255,6 +255,10 @@ module Concurrent
end

it 'updates dont block reads' do
if defined?(Concurrent::Collection::SynchronizedMapBackend) && described_class <= Concurrent::Collection::SynchronizedMapBackend
skip("Test does not apply to #{Concurrent::Collection::SynchronizedMapBackend}")
end

getters_count = 20
key_klass = Concurrent::ThreadSafe::Test::HashCollisionKey
keys = [key_klass.new(1, 100),
Expand Down

0 comments on commit 8912af0

Please sign in to comment.