@@ -668,10 +668,19 @@ defmodule Keyword do
668
668
@ doc since: "1.11.0"
669
669
@ spec replace ( t , key , value ) :: t
670
670
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
+ [ ]
675
684
end
676
685
677
686
@ doc """
@@ -704,7 +713,7 @@ defmodule Keyword do
704
713
[ e | replace! ( keywords , key , value , original ) ]
705
714
end
706
715
707
- defp replace! ( [ ] , key , _value , original ) when is_atom ( key ) do
716
+ defp replace! ( [ ] , key , _value , original ) do
708
717
raise ( KeyError , key: key , term: original )
709
718
end
710
719
0 commit comments