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 elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/f82edae0-c129-4d39-946e-7f15576f271an%40googlegroups.com.