defmodule Raindrops do
  @doc """
  Returns a string based on raindrop factors.

  - If the number contains 3 as a prime factor, output 'Pling'.
  - If the number contains 5 as a prime factor, output 'Plang'.
  - If the number contains 7 as a prime factor, output 'Plong'.
  - If the number does not contain 3, 5, or 7 as a prime factor,
    just pass the number's digits straight through.
  """
  @results [
    {3, "Pling"},
    {5, "Plang"},
    {7, "Plong"}
  ]

  @spec convert(pos_integer) :: String.t()
  def convert(number) do
    @results
    |> Enum.map_join(&mapper(number, &1))
    |> case do
      "" -> Integer.to_string(number)
      result -> result
    end
  end

  defp mapper(number, {factor, value}) do
    if rem(number, factor) == 0, do: value, else: ""
  end
end