   @doc """
   Merges two keyword lists into one.
 
-  All keys, including duplicated keys, given in `keywords2` will be added
-  to `keywords1`, overriding any existing one.
-
-  There are no guarantees about the order of keys in the returned keyword.
+  All keys, including duplicate keys, given in `keywords2` will be added
+  to `keywords1`, overriding any existing ones.
+
+  There are no guarantees about the order of the keys in the returned keyword.
 
   ## Examples
 

  end

  @doc """
  Gets the value for a specific `key`.

  If `key` does not exist, return the default value
  (`nil` if no default value).

  If duplicated entries exist, the first one is returned.
  Use `get_values/2` to retrieve all entries.

  ## Examples

  """
  @spec keys(t) :: [key]
  def keys(keywords) when is_list(keywords) do
    :lists.map(
      fn
        {key, _} when is_atom(key) -> key
        element -> throw(element)
      end,
      keywords
    )
  catch
    element ->
      raise ArgumentError,
            "expected a keyword list, but an entry in the list is not a two-element tuple " <>
              "with an atom as its first element, got: #{inspect(element)}"
  end

  @doc """
  Returns all values from the keyword list.

  Values from duplicate keys will be kept in the resulting list of values.

  ## Examples

