From 71f07786c8aca5d8dc292c1976ca7cf47760a7e4 Mon Sep 17 00:00:00 2001 From: Kevin Menard Date: Tue, 17 Jan 2023 15:45:15 -0500 Subject: [PATCH] Implement `Array#intersect?`. --- CHANGELOG.md | 1 + spec/ruby/core/array/intersect_spec.rb | 6 ++++-- spec/tags/core/array/intersect_tags.txt | 2 -- src/main/ruby/truffleruby/core/array.rb | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) delete mode 100644 spec/tags/core/array/intersect_tags.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index d6cfb1b5f78b..e67c167cb880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Compatibility: * Fix execution order of `END` blocks and `at_exit` callbacks (#2818, @andrykonchin). * Fix `String#casecmp?` for empty strings of different encodings (#2826, @eregon). * Implement `Enumerable#compact` and `Enumerator::Lazy#compact` (#2733, @andrykonchin). +* Implement `Array#intersect?` (#2831, @nirvdrum). Performance: diff --git a/spec/ruby/core/array/intersect_spec.rb b/spec/ruby/core/array/intersect_spec.rb index b8c5b1e69add..773e44c0734c 100644 --- a/spec/ruby/core/array/intersect_spec.rb +++ b/spec/ruby/core/array/intersect_spec.rb @@ -4,13 +4,15 @@ ruby_version_is '3.1' do # https://bugs.ruby-lang.org/issues/15198 describe 'when at least one element in two Arrays is the same' do it 'returns true' do - [1, 2].intersect?([2, 3]).should == true + [1, 2].intersect?([2, 3, 4]).should == true + [2, 3, 4].intersect?([1, 2]).should == true end end describe 'when there are no elements in common between two Arrays' do it 'returns false' do - [1, 2].intersect?([3, 4]).should == false + [0, 1, 2].intersect?([3, 4]).should == false + [3, 4].intersect?([0, 1, 2]).should == false end end end diff --git a/spec/tags/core/array/intersect_tags.txt b/spec/tags/core/array/intersect_tags.txt deleted file mode 100644 index cce8ad66e2fe..000000000000 --- a/spec/tags/core/array/intersect_tags.txt +++ /dev/null @@ -1,2 +0,0 @@ -fails:Array#intersect? when at least one element in two Arrays is the same returns true -fails:Array#intersect? when there are no elements in common between two Arrays returns false diff --git a/src/main/ruby/truffleruby/core/array.rb b/src/main/ruby/truffleruby/core/array.rb index dad874dc3df8..2c07ca0ca375 100644 --- a/src/main/ruby/truffleruby/core/array.rb +++ b/src/main/ruby/truffleruby/core/array.rb @@ -614,6 +614,21 @@ def inspect end alias_method :to_s, :inspect + def intersect?(other) + return false if size == 0 || other.size == 0 + + shorter, longer = size > other.size ? [other, self] : [self, other] + + shorter_set = {} + shorter.each { |e| shorter_set[e] = true } + + longer.each do |e| + return true if shorter_set.include?(e) + end + + false + end + def intersection(*others) return self & others.first if others.size == 1