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