lib/dictionary.ex

defmodule Dictionary do
  @moduledoc """
  The Dictionary module provides a way to interact with words files.

  Currently we use a popular.txt file as default, but you can bring your own file.

  At this stage you can use it to create your slugs based on the provided words.
  """
  alias Dictionary.Impl.WordList

  @opaque t :: WordList.t()
  @opaque word :: WordList.word()
  @opaque slug :: WordList.slug()
  @opaque path :: String.t()

  @doc """
  Start 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 start() :: t
  defdelegate start(), to: WordList, as: :word_list

  @spec start(WordList.file()) :: t
  defdelegate start(file), to: WordList, as: :word_list

  @doc """
  Get a random word using the words provided.
  """
  @spec random_word(t) :: word
  defdelegate random_word(words), to: WordList

  @doc """
  Get a random slug using the words provided.
  """
  @spec random_slug(t, size_or_range :: integer | struct) :: slug
  defdelegate random_slug(words, range), to: WordList

  @doc """
  Give the application dictionary path to get the popular.txt file.
  """
  @spec popular_dictionary_path() :: path
  defdelegate popular_dictionary_path, to: WordList
end