lib/conjugate_be.ex

defmodule ConjugateBe do
  require ConjugateHave

  def conjugate(options) do
    case options[:tense] do
      "present" -> present(options)
      "past" -> past(options)
      "past_perfect" -> past_perfect(options)
      "past_progressive" -> past_progressive(options)
      "future" -> future(options)
    end
  end

  defp present(options) do
    case options[:plurality] do
      "singular" -> present_singular(options[:person])
      _ -> "are"
    end
  end

  defp past(options) do
    case options[:plurality] do
      "singular" -> past_singular(options[:person])
      _ -> "were"
    end
  end

  defp past_perfect(options) do
    (options
    |> Map.merge(%{:tense => "past"})
    |> ConjugateHave.conjugate)
    <> " been"
  end

  defp past_progressive(options) do
    (options
     |> Map.merge(%{:tense => "past"})
     |> ConjugateBe.conjugate)
    <> " being"

  end

  defp future(_) do "will be" end

  defp present_singular(person) do
    case person do
      "first" -> "am"
      "second" -> "are"
      _ -> "is"
    end
  end

  defp past_singular(person) do
    case person do
      "second" -> "were"
      _ -> "was"
    end
  end
end