Sounds good to me. Adding new bang variants are relatively
straight-forward. Can you please send a PR? Also, for consistency reasons,
can you please change Access.at/1 to become Access.at(index, default \\
nil)?

Thank you!

On Mon, Jul 6, 2020 at 12:40 PM Henrik N <hen...@nyh.se> wrote:

> Hi,
>
> I propose adding an `Access.at!` that raises when the given index is out
> of bounds, analogous to `Access.key!`.
>
> The current `Access.at` is not nil safe as discussed in
> https://groups.google.com/g/elixir-lang-core/c/CvdW1FsvSf0/m/nlvxkThuEwAJ,
> but it's also not analogous to `Access.key!`.
>
> I specifically want it to raise and point to being out of range (or
> whatever the terminology is), rather than causing nil errors further down
> the line.
>
> Current behaviour with `Access.at`:
>
> # Happy case. Everything exists.
> iex(20)> get_in([%{key: "value"}], [Access.at(0), :key])
> "value"
>
> # Nil safe when index is out of bounds.
> iex(21)> get_in([%{key: "value"}], [Access.at(1), :key])
> nil
>
> # Not nil safe, but error doesn't point to the array index.
> iex(22)> get_in([%{key: "value"}], [Access.at(1), Access.key!(:key)])
> ** (RuntimeError) Access.key!/1 expected a map/struct, got: nil
>     (elixir 1.10.3) lib/access.ex:514: anonymous fn/4 in Access.key!/1
>
> I propose something like this behaviour, with `Access.at!`:
>
> # Happy case – behaves the same.
> iex(20)> get_in([%{key: "value"}], [Access.at!(0), :key])
> "value"
>
> # Explodes.
> iex(21)> get_in([%{key: "value"}], [Access.at!(1), :key])
> ** (FooError) index 1 not found in: [%{key: "value"}]. Its highest index
> is 0.
>
> # Explodes in the same way.
> iex(22)> get_in([%{key: "value"}], [Access.at(1), Access.key!(:key)])
> ** (FooError) index 1 not found in: [%{key: "value"}]. Its highest index
> is 0.
>
> What do you think?
>
> --
> 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/3a5d1489-dfa5-4c0c-bcd1-5cb85eac2f3fn%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/3a5d1489-dfa5-4c0c-bcd1-5cb85eac2f3fn%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 elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4J%3DFZZiwmvAq9ELn2V8tYSmn0R%3D%2Bkt7J9U2HLZWCZDkgA%40mail.gmail.com.

Reply via email to