summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-array-ext
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-09-21 00:01:48 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-09-21 00:01:48 +0900
commitf23f2bbdad7a15bec8812b029cb23c2117d7c63c (patch)
tree8e310268b491f6b59673e36a94be4bbd30b778f7 /mrbgems/mruby-array-ext
parentdd346be99aaf6d0220f067c78decb29548c7dfe6 (diff)
downloadmruby-f23f2bbdad7a15bec8812b029cb23c2117d7c63c.tar.gz
mruby-f23f2bbdad7a15bec8812b029cb23c2117d7c63c.zip
Implement `Array#union` which is introduced in Ruby2.6.
Diffstat (limited to 'mrbgems/mruby-array-ext')
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb19
-rw-r--r--mrbgems/mruby-array-ext/test/array.rb8
2 files changed, 27 insertions, 0 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 4f676a121..8c2acc7ac 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -139,6 +139,25 @@ class Array
##
# call-seq:
+ # ary.union(other_ary,...) -> new_ary
+ #
+ # Set Union---Returns a new array by joining this array with
+ # <i>other_ary</i>, removing duplicates.
+ #
+ # ["a", "b", "c"].union(["c", "d", "a"], ["a", "c", "e"])
+ # #=> ["a", "b", "c", "d", "e"]
+ #
+ def union(*args)
+ ary = self.dup
+ args.each_with_index do |x,i|
+ ary.concat(x)
+ ary.uniq! if i % 20 == 0
+ end
+ ary.uniq! or ary
+ end
+
+ ##
+ # call-seq:
# ary & other_ary -> new_ary
#
# Set Intersection---Returns a new array
diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb
index 4f54c65c3..84f9cfeaf 100644
--- a/mrbgems/mruby-array-ext/test/array.rb
+++ b/mrbgems/mruby-array-ext/test/array.rb
@@ -75,6 +75,14 @@ assert("Array#|") do
assert_equal [1, 2, 3, 1], a
end
+assert("Array#union") do
+ a = [1, 2, 3, 1]
+ b = [1, 4]
+ c = [1, 5]
+
+ assert_equal [1, 2, 3, 4, 5], a.union(b,c)
+end
+
assert("Array#&") do
a = [1, 2, 3, 1]
b = [1, 4]