@@ -668,10 +668,19 @@ defmodule Keyword do
668668 @ doc since: "1.11.0"
669669 @ spec replace ( t , key , value ) :: t
670670 def replace ( keywords , key , value ) when is_list ( keywords ) and is_atom ( key ) do
671- case :lists . keyfind ( key , 1 , keywords ) do
672- { ^ key , _ } -> [ { key , value } | delete ( keywords , key ) ]
673- false -> keywords
674- end
671+ do_replace ( keywords , key , value )
672+ end
673+
674+ defp do_replace ( [ { key , _ } | keywords ] , key , value ) do
675+ [ { key , value } | delete ( keywords , key ) ]
676+ end
677+
678+ defp do_replace ( [ { _ , _ } = e | keywords ] , key , value ) do
679+ [ e | do_replace ( keywords , key , value ) ]
680+ end
681+
682+ defp do_replace ( [ ] , _key , _value ) do
683+ [ ]
675684 end
676685
677686 @ doc """
@@ -704,7 +713,7 @@ defmodule Keyword do
704713 [ e | replace! ( keywords , key , value , original ) ]
705714 end
706715
707- defp replace! ( [ ] , key , _value , original ) when is_atom ( key ) do
716+ defp replace! ( [ ] , key , _value , original ) do
708717 raise ( KeyError , key: key , term: original )
709718 end
710719
0 commit comments