add method(uniq, -, |, &, flatten, compact) and test of Array to mruby-array-ext
[mruby.git] / mrbgems / mruby-array-ext / mrblib / array.rb
blob83eaaa35efa08ba0ae45a7da9de3c89313983831
1 class Array
2   def uniq!
3     ary = self.dup
4     result = []
5     while ary.size > 0
6       result << ary.shift
7       ary.delete(result.last)
8     end
9     self.replace(result)
10   end
12   def uniq
13     self.dup.uniq!
14   end
16   def -(elem)
17     raise TypeError, "can't convert to Array" unless elem.class == Array
19     hash = {}
20     array = []
21     elem.each { |x| hash[x] = true }
22     self.each { |x| array << x unless hash[x] }
23     array
24   end
26   def |(elem)
27     raise TypeError, "can't convert to Array" unless elem.class == Array
29     (self + elem).uniq!
30   end
32   def &(elem)
33     raise TypeError, "can't convert to Array" unless elem.class == Array
35     hash = {}
36     array = []
37     elem.each{|v| hash[v] = true }
38     self.each do |v|
39       if hash[v]
40         array << v
41         hash.delete v
42       end
43     end
44     array
45   end
47   def flatten(depth=nil)
48     ar = []
49     self.each do |e|
50       if e.is_a?(Array) && (depth.nil? || depth > 0)
51         ar += e.flatten(depth.nil? ? nil : depth - 1)
52       else
53         ar << e
54       end
55     end
56     ar
57   end
59   def flatten!
60     self.replace(self.flatten)
61   end
63   def compact
64     result = self.dup
65     result.compact!
66     result
67   end
69   def compact!
70     result = self.select { |e| e != nil }
71     self.replace(result)
72   end
73 end