class Tocer::Writer

:reek:DataClump
Writes table of contents to a Markdown document.

def self.add start_index:, old_lines:, new_lines:

def self.add start_index:, old_lines:, new_lines:
  computed_new_lines = start_index.zero? ? new_lines : new_lines + "\n"
  old_lines.insert start_index, *computed_new_lines
end

def self.remove start_index, finish_index, lines

def self.remove start_index, finish_index, lines
  range = (start_index - 1)..finish_index
  lines.reject.with_index { |_, index| range.include? index }
end

def call path, label: Container[:configuration].label

def call path, label: Container[:configuration].label
  path.rewrite do |body|
    lines = body.each_line.to_a
    builder.prependable?(lines) ? prepend(lines, label) : replace(lines, label)
  end
end

def content(lines, label) = builder.call(lines, label:)

def content(lines, label) = builder.call(lines, label:)

def initialize builder: Builder.new

def initialize builder: Builder.new
  @builder = builder
end

def new_lines lines, label, finish_index

def new_lines lines, label, finish_index
  if builder.unbuildable? lines
    builder.comments
  else
    content lines[finish_index, lines.length], label
  end
end

def prepend(lines, label) = [content(lines, label), lines.join].compress.join("\n")

def prepend(lines, label) = [content(lines, label), lines.join].compress.join("\n")

def replace lines, label

def replace lines, label
  start_index = builder.start_index lines
  finish_index = builder.finish_index lines
  klass = self.class
  klass.add(
    start_index:,
    old_lines: klass.remove(start_index, finish_index, lines),
    new_lines: new_lines(lines, label, finish_index)
  ).join
end