lib/multi_range.rb in multi_range-0.0.2 vs lib/multi_range.rb in multi_range-0.0.3

- old
+ new

@@ -18,15 +18,15 @@ INDEX_WITH_DEFAULT = Object.new attr_reader :ranges def initialize(ranges) # range 要由小到大排序,且各 range 不能重疊 - @ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s } + @ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }.freeze end def -(other) - new_ranges = @ranges.clone + new_ranges = @ranges.dup return MultiRange.new(new_ranges) if new_ranges.empty? return MultiRange.new(new_ranges) if other.min > @ranges.last.max # 大於最大值 return MultiRange.new(new_ranges) if other.max < @ranges.first.min # 小於最小值 @@ -64,11 +64,11 @@ @ranges.any? end def index_with(default = INDEX_WITH_DEFAULT) if block_given? - fail ArgumentError.new('wrong number of arguments (given 1, expected 0)') if default != INDEX_WITH_DEFAULT + fail ArgumentError, 'wrong number of arguments (given 1, expected 0)' if default != INDEX_WITH_DEFAULT return map{|s| [s, yield(s)] }.to_h end return to_enum(:index_with){ size } if default == INDEX_WITH_DEFAULT return map{|s| [s, default] }.to_h @@ -83,7 +83,21 @@ end def map return to_enum(:map){ size } if !block_given? return each.map{|s| yield(s) } + end + + def to_a + each.to_a + end + + def min + range = @ranges.first + return range.min if range + end + + def max + range = @ranges.last + return range.max if range end end