The disadvantage of introducing functions like this,
is that we inevitably end up with duplication between functions which
work in general in `List`,
as well as functions which work the same way, but only if the key(s) in
the list happen to all be atoms, in the `Keyword` module.

Maybe we can reconsider the restriction that `Keyword` requires all keys
to always be atoms? Could we loosen this restriction?

~Wiebe-Marten / Qqwy


On 06-07-2021 14:20, José Valim wrote:

> I think having a function in the shape of List.key* but one that
> assumes a certain shape (i.e. a two-element tuple) is
> counter-intuitive. We could have List.keyfind!(...) but it should
> still return a tuple in case of success. :)
>
> On Tue, Jul 6, 2021 at 1:38 PM Wojtek Mach <[email protected]
> <mailto:[email protected]>> wrote:
>
>     When working with lists of two element tuples like:
>
>         headers = [{"content-type", "html"}]
>         attributes = [{"href", "https://elixir-lang.org
>     <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]
>     <mailto:[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
>     
> <https://groups.google.com/d/msgid/elixir-lang-core/f82edae0-c129-4d39-946e-7f15576f271an%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> -- 
> 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]
> <mailto:[email protected]>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JYyEbX_QLMAqnaa6mo8mOd_iy0eSc876_i5R9omMgc4w%40mail.gmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JYyEbX_QLMAqnaa6mo8mOd_iy0eSc876_i5R9omMgc4w%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
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/f2ca34d8-3e3a-df23-bf40-43fd891393e9%40resilia.nl.

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to