lib/recode/utils.ex

defmodule Recode.Utils do
  @moduledoc """
  This module provides utility functions for `recode`.
  """

  @doc """
  Returns `true` id `value` ends with `suffix`.

  Both, value and suffix must be lists or module aliases.

  ## Examples

      iex> Recode.Utils.ends_with?(Foo.Bar, Bar)
      true
      iex> Recode.Utils.ends_with?(Foo, Foo.Bar)
      false
      iex> Recode.Utils.ends_with?(Foo.Bar, Baz)
      false

      iex> Recode.Utils.ends_with?([1, 2, 3], [2, 3])
      true
      iex> Recode.Utils.ends_with?([1, 2, 3], [2, 9])
      false
  """
  @spec ends_with?(value :: list() | module(), suffix :: list() | module()) :: boolean
  def ends_with?(value, suffix) when is_atom(value) and is_atom(suffix) do
    list = Module.split(value)
    suffix = Module.split(suffix)

    ends_with?(list, suffix)
  end

  def ends_with?(list, suffix) when is_list(list) and is_list(suffix) do
    case length(list) - length(suffix) do
      diff when diff < 0 -> false
      diff -> Enum.drop(list, diff) == suffix
    end
  end
end