   @doc """
   Returns all words in the word list.
   """
+  @spec words :: list
   def words do
     Agent.get(__MODULE__, &(&1))
   end

  Returns a stream of `words` that are between `min`
  and `max` characters in length.
  """
  def between(words, [min: min]) do
    words |> Stream.filter(&min_length?(&1, min))
  end

  @doc """
  Returns a stream of `words` that can be made from `letters`.
  """
  @spec using(Enumerable.t, list) :: Enumerable.t
  @spec using(Enumerable.t, String.t) :: Enumerable.t

  def using(words, letters) when is_list(letters) do
    words |> Stream.filter(&possible?(&1, letters))
  end
