lib/chaps/stop_words.ex

defmodule Chaps.StopWords do
  @moduledoc """
  Handles stop words for filtering the coverage results.
  """

  @doc """
  Filters out pre-defined stop words.
  """
  def filter(info, words \\ Chaps.Settings.get_stop_words()) do
    Enum.map(info, fn x -> do_filter(x, words) end)
  end

  defp do_filter(%{name: name, source: source, coverage: coverage}, words) do
    lines = String.split(source, "\n")

    list =
      Enum.zip(lines, coverage)
      |> Enum.map(fn x -> has_valid_line?(x, words) end)
      |> List.zip()
      |> Enum.map(&Tuple.to_list(&1))

    [source, coverage] = parse_filter_list(list)
    %{name: name, source: source, coverage: coverage}
  end

  defp parse_filter_list([]), do: ["", []]

  defp parse_filter_list([lines, coverage]),
    do: [Enum.join(lines, "\n"), coverage]

  defp has_valid_line?({line, coverage}, words) do
    if find_stop_words(line, words) == false do
      {line, coverage}
    else
      {line, nil}
    end
  end

  defp find_stop_words(line, words) do
    Enum.any?(words, fn word -> line =~ word end)
  end
end