@@ -358,6 +358,27 @@ defmodule Access do
358358
359359 ## Accessors
360360
361+ @ doc false
362+ def key ( key ) do
363+ IO . warn "Access.key/1 is deprecated due to erratic behaviour for missing keys, " <>
364+ "please use Access.key/2 instead with proper default values"
365+
366+ fn
367+ :get , data , next ->
368+ next . ( Map . get ( to_map ( data ) , key ) )
369+ :get_and_update , data , next ->
370+ value = Map . get ( to_map ( data ) , key )
371+ case next . ( value ) do
372+ { get , update } -> { get , Map . put ( data , key , update ) }
373+ :pop -> { value , Map . delete ( data , key ) }
374+ end
375+ end
376+ end
377+
378+ defp to_map ( nil ) , do: % { }
379+ defp to_map ( % { } = map ) , do: map
380+ defp to_map ( data ) , do: raise "Access.key/1 expected a map/struct or nil, got: #{ inspect data } "
381+
361382 @ doc """
362383 Returns a function that accesses the given key in a map/struct.
363384
@@ -397,7 +418,7 @@ defmodule Access do
397418 ** (BadMapError) expected a map, got: []
398419
399420 """
400- def key ( key , default \\ nil ) do
421+ def key ( key , default ) do
401422 fn
402423 :get , data , next ->
403424 next . ( Map . get ( data , key , default ) )
0 commit comments