mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
99 lines
1.7 KiB
Ruby
99 lines
1.7 KiB
Ruby
class Array
|
|
def uniq!
|
|
ary = self.dup
|
|
result = []
|
|
while ary.size > 0
|
|
result << ary.shift
|
|
ary.delete(result.last)
|
|
end
|
|
if result.size == self.size
|
|
nil
|
|
else
|
|
self.replace(result)
|
|
end
|
|
end
|
|
|
|
def uniq
|
|
ary = self.dup
|
|
ary.uniq!
|
|
ary
|
|
end
|
|
|
|
def -(elem)
|
|
raise TypeError, "can't convert to Array" unless elem.class == Array
|
|
|
|
hash = {}
|
|
array = []
|
|
elem.each { |x| hash[x] = true }
|
|
self.each { |x| array << x unless hash[x] }
|
|
array
|
|
end
|
|
|
|
def |(elem)
|
|
raise TypeError, "can't convert to Array" unless elem.class == Array
|
|
|
|
ary = self + elem
|
|
ary.uniq! or ary
|
|
end
|
|
|
|
def &(elem)
|
|
raise TypeError, "can't convert to Array" unless elem.class == Array
|
|
|
|
hash = {}
|
|
array = []
|
|
elem.each{|v| hash[v] = true }
|
|
self.each do |v|
|
|
if hash[v]
|
|
array << v
|
|
hash.delete v
|
|
end
|
|
end
|
|
array
|
|
end
|
|
|
|
def flatten(depth=nil)
|
|
ar = []
|
|
self.each do |e|
|
|
if e.is_a?(Array) && (depth.nil? || depth > 0)
|
|
ar += e.flatten(depth.nil? ? nil : depth - 1)
|
|
else
|
|
ar << e
|
|
end
|
|
end
|
|
ar
|
|
end
|
|
|
|
def flatten!(depth=nil)
|
|
modified = false
|
|
ar = []
|
|
self.each do |e|
|
|
if e.is_a?(Array) && (depth.nil? || depth > 0)
|
|
ar += e.flatten(depth.nil? ? nil : depth - 1)
|
|
modified = true
|
|
else
|
|
ar << e
|
|
end
|
|
end
|
|
if modified
|
|
self.replace(ar)
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def compact
|
|
result = self.dup
|
|
result.compact!
|
|
result
|
|
end
|
|
|
|
def compact!
|
|
result = self.select { |e| e != nil }
|
|
if result.size == self.size
|
|
nil
|
|
else
|
|
self.replace(result)
|
|
end
|
|
end
|
|
end
|