lib/impl/word_list.ex

defmodule Dictionary.Impl.WordList do
  @moduledoc """
  Retrieve the word list by default it used de popular words from.
  """
  @type t :: list(String.t())
  @type word :: String.t()
  @type file :: file :: String.t()
  @type slug :: String.t()

  @doc """
  Returns a list of words, if you provide a file with the new dictionary
  It will load to the memory instead, by default it uses a popular dictionary.
  """
  @spec word_list(file) :: t
  @spec word_list() :: t
  def word_list(file \\ popular_dictionary_path()) do
    file
    |> File.read!()
    |> String.split("\n", trim: true)
  end

  @doc """
  Get a random word using the words provided.
  """
  @spec random_word(t) :: word
  def random_word(words), do: Enum.random(words)

  @doc """
  Get a random slug using the words provided.
  """
  @spec random_slug(t, number_of_words :: integer | struct) :: slug
  def random_slug(words, size) when is_integer(size) and size > 0 do
    random_slug(words, 1..size)
  end

  def random_slug(words, %Range{} = range) do
    range
    |> Enum.map(fn _ -> random_word(words) end)
    |> Enum.join("-")
  end

  def popular_dictionary_path do
    Application.app_dir(:defdo_dictionary, "/priv/popular.txt")
  end
end