The Access protocol is used by foo[bar] and also
empowers the nested update functions in Kernel.
For instance, foo[bar] translates Access.get(foo, bar).
Kernel.get_in/2, Kernel.put_in/3, Kernel.update_in/3 and
Kernel.get_and_update_in/3 are also all powered by the Access
protocol.
This protocol is implemented by default for keywords, maps and dictionary like types:
iex> keywords = [a: 1, b: 2]
iex> keywords[:a]
1
iex> map = %{a: 1, b: 2}
iex> map[:a]
1
iex> star_ratings = %{1.0 => "★", 1.5 => "★☆", 2.0 => "★★"}
iex> star_ratings[1.5]
"★☆"
The key comparison must be implemented using the === operator.