class Opal::SourceMap::File

def relative_mappings

def relative_mappings
  @relative_mappings ||= begin
    reference_segment = [0, 0, 0, 0, 0]
    reference_name_index = 0
    absolute_mappings.map do |absolute_mapping|
      # [generated_column, source_index, original_line, original_column, map_name_index]
      reference_segment[0] = 0 # reset the generated_column at each new line
      absolute_mapping.map do |absolute_segment|
        segment = []
        segment[0] = absolute_segment[0] - reference_segment[0]
        segment[1] = absolute_segment[1] - (reference_segment[1] || 0)
        segment[2] = absolute_segment[2] - (reference_segment[2] || 0)
        segment[3] = absolute_segment[3] - (reference_segment[3] || 0)
        # Since [4] can be nil we need to keep track of it in the reference_segment even if it's nil in absolute_segment
        if absolute_segment[4]
          segment[4] = absolute_segment[4].to_int - (reference_segment[4] || reference_name_index).to_int
          reference_name_index = absolute_segment[4]
        end
        reference_segment = absolute_segment
        segment
      end
    end
  end
end