lib/interval_notation/operations.rb in interval_notation-0.1.1 vs lib/interval_notation/operations.rb in interval_notation-0.1.2
- old
+ new
@@ -2,61 +2,18 @@
require_relative 'basic_intervals'
require_relative 'combiners'
module IntervalNotation
module Operations
- # Internal method which combines intervals according to an algorithm given by a combiner.
- # Combiner tells whether current section or point should be included to a new interval.
- def combine(interval_sets, combiner)
- points = interval_sets.each_with_index.flat_map{|interval_set, interval_set_index|
- interval_set.intervals.flat_map{|interval|
- interval.interval_boundaries(interval_set_index)
- }
- }.sort_by(&:value)
-
- intervals = []
-
- incl_from = nil
- from = nil
-
- points.chunk(&:value).each do |point_value, points_on_place|
- combiner.pass(points_on_place)
-
- if combiner.previous_state
- if combiner.state
- unless combiner.include_last_point
- intervals << BasicIntervals.interval_by_boundary_inclusion(incl_from, from, false, point_value)
- incl_from = false
- from = point_value
- end
- else
- to = point_value
- incl_to = combiner.include_last_point
- intervals << BasicIntervals.interval_by_boundary_inclusion(incl_from, from, incl_to, to)
- from = nil # easier to find an error (but not necessary code)
- incl_from = nil # ditto
- end
- else
- if combiner.state
- from = point_value
- incl_from = combiner.include_last_point
- else
- intervals << BasicIntervals::Point.new(point_value) if combiner.include_last_point
- end
- end
- end
- IntervalSet.new_unsafe(intervals)
- end
-
# Union of multiple intervals.
def union(intervals)
- combine(intervals, UnionCombiner.new(intervals.size))
+ UnionCombiner.new(intervals.size).combine(intervals)
end
# Intersection of multiple intervals
def intersection(intervals)
- combine(intervals, IntersectCombiner.new(intervals.size))
+ IntersectCombiner.new(intervals.size).combine(intervals)
end
- module_function :combine, :union, :intersection
+ module_function :union, :intersection
end
end