   @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

    iex> WordFinder.similarity "cozy", "fullers"
    0
  """
  def similar_to(words, compare_word, min_similarity) do
    Stream.filter(words, fn word ->
      similarity(word, compare_word) >= min_similarity
    end)
  end

  def similarity(a, b) do
    a
    |> compare_words(b)

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