Skip to content

Commit 501271c

Browse files
committed
Make replace and replace! in Keyword consistent, closes #10345
1 parent fd4a6ad commit 501271c

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

lib/elixir/lib/keyword.ex

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)