# Merge Intervals
#
# Дан массив интервалов intervals, где intervals[i] = [start_i, end_i].
# Напиши функцию merge(intervals), которая объединяет все пересекающиеся
# интервалы и возвращает массив непересекающихся интервалов, покрывающих
# все входные.
#
# Интервалы считаются пересекающимися, если они накладываются или
# соприкасаются (конец одного равен началу другого).
#
# Примеры:
#   merge([[1,3],[2,6],[8,10],[15,18]])  →  [[1,6],[8,10],[15,18]]
#   merge([[1,4],[4,5]])                 →  [[1,5]]
#
# Ограничения:
#   1 <= intervals.length <= 10^4
#   intervals[i].length == 2
#   0 <= start_i <= end_i <= 10^4
#
# Подсказка (если нужна): вход приходит в произвольном порядке.


def merge(intervals)
  result = []

  intervals = intervals.sort_by(&:first)


  (0..intervals.size - 1).each do |index|
    current = intervals[index]
    if result.empty?
      result.push current
    else
      if intersect?(result.last, current)
        merge_into_first(result.last, current)
      else
        result.push current
      end
    end
  end

  result
end

def merge_into_first(first, second)
  first[1] = [first[1], second[1]].max
end

def intersect?(a, b)
  a[1] >= b[0]
end


