# ┌──────────────────────────────────────────────────────────────┐
# │ Based on the course "Elixir for Programmers" by Dave Thomas. │
# └──────────────────────────────────────────────────────────────┘
defmodule Hangman.Dictionary do
@moduledoc """
Dictionary for the _Hangman Game_. Returns a random word.
##### Based on the course [Elixir for Programmers](https://codestool.coding-gnome.com/courses/elixir-for-programmers) by Dave Thomas.
"""
alias __MODULE__.WordsAgent
@typedoc "A word with letters from a to z"
@type word :: String.t()
@doc """
Returns a random word from the dictionary agent.
## Examples
iex> alias Hangman.Dictionary
iex> for _ <- 0..99, uniq: true do
iex> Dictionary.random_word() =~ ~r/^[a-z]+$/
iex> end
[true]
iex> alias Hangman.Dictionary.WordsAgent
iex> words = Agent.get(WordsAgent, & &1)
iex> Enum.all?(words, & &1 =~ ~r/^[a-z]+$/)
true
"""
@spec random_word :: word
def random_word, do: Agent.get(WordsAgent, &Enum.random/1)
@doc """
Returns the number of words in the dictionary agent.
## Examples
iex> alias Hangman.Dictionary
iex> Dictionary.word_count
9133
"""
@spec word_count :: pos_integer
def word_count, do: Agent.get(WordsAgent, &length/1)
end