When working with lists of two element tuples like:
headers = [{"content-type", "html"}]
attributes = [{"href", "https://elixir-lang.org"}]
I'd usually access the value like this:
{_, content_type} = List.keyfind(headers, "content-type", 0)
IO.puts content_type
And when the value is not there, I'd get:
** (MatchError) no match of right hand side value: nil
I'd like to propose adding a new function so instead we could do:
IO.puts List.keyfetch!(headers, "content-type")
This function can give a better error message and is pipe friendly. It only
works on lists with k/v, hence using the word fetch which reminds us of
`Map.fetch`, `Keyword.fetch`, etc.
## Example implementation
def keyfetch!(list, key) do
case List.keyfind(list, key, 0) do
{_, value} ->
value
nil ->
raise "key not found: #{inspect(key)}"
tuple ->
raise "expected list to contain two-element tuples, got:
#{inspect(tuple)}"
end
end
## Q & A
Q: Why not `List.keyfind!(list, key, position)` that returns the value?
A: The crux of the proposal is to be able to do this:
List.keyfind!([{"a", 1}], "a", 0)
#=> 1
But given it is called `keyfind` we should also handle this and it is
unclear what
it should return:
List.keyfind!([{"a", 1, 2}], "a", 0)
#=> ???
Q: Why not `List.keyfind!(list, key, position)` that returns the tuple?
A: I think that'd be an improvement although we'd still have to manually
unpack the value which is a bit annoying.
Q: Why not `List.keyfetch!(list, key, position \\ 0)`?
A: I'd be ok with that.
Q: Should there also be a non-raising variant, `List.keyfetch(list, key)`?
A: In that case I think it's fine to pattern match on `List.keyfind/3` but
yeah, I could see it added for consistency.
--
You received this message because you are subscribed to the Google Groups
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/f82edae0-c129-4d39-946e-7f15576f271an%40googlegroups.com.