defmodule Hangman.Dictionary.WordsAgent do @moduledoc """ Agent that loads a list of words from an external file. """ use Agent use PersistConfig alias __MODULE__ @words_path get_env(:words_path) @doc """ Starts an agent that loads a list of words from an external file. ## Examples iex> alias Hangman.Dictionary.WordsAgent iex> {:error, {:already_started, agent}} = WordsAgent.start_link(:ok) iex> is_pid(agent) and agent == Process.whereis(WordsAgent) true """ @spec start_link(term) :: Agent.on_start() def start_link(:ok = _arg), do: Agent.start_link(&init/0, name: WordsAgent) ## Private functions # @doc """ # Returns a list of lowercase words read from an external file. # ## Examples # iex> alias Hangman.Dictionary.WordsAgent # iex> words = WordsAgent.init() # iex> {length(words), is_list(words)} # {8881, true} # """ @spec init :: [String.t()] defp init do for word <- File.stream!(@words_path) do String.trim(word) |> String.downcase() end end end