Skip to content

Commit 20cd669

Browse files
authored
Optimize Keyword.validate/2 to avoid building new list (#15269)
1 parent 03b45e5 commit 20cd669

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

lib/elixir/lib/keyword.ex

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -270,34 +270,34 @@ defmodule Keyword do
270270
@spec validate(keyword(), values :: [atom() | {atom(), term()}]) ::
271271
{:ok, keyword()} | {:error, [atom]}
272272
def validate(keyword, values) when is_list(keyword) and is_list(values) do
273-
validate(keyword, values, [], [], [])
273+
validate(keyword, values, [], keyword, [])
274274
end
275275

276-
defp validate([{key, _} = pair | keyword], values1, values2, acc, bad_keys) when is_atom(key) do
276+
defp validate([{key, _} | keyword], values1, values2, original, bad_keys) when is_atom(key) do
277277
case find_key!(key, values1, values2) do
278278
{values1, values2} ->
279-
validate(keyword, values1, values2, [pair | acc], bad_keys)
279+
validate(keyword, values1, values2, original, bad_keys)
280280

281281
:error ->
282282
case find_key!(key, values2, values1) do
283283
{values1, values2} ->
284-
validate(keyword, values1, values2, [pair | acc], bad_keys)
284+
validate(keyword, values1, values2, original, bad_keys)
285285

286286
:error ->
287-
validate(keyword, values1, values2, acc, [key | bad_keys])
287+
validate(keyword, values1, values2, original, [key | bad_keys])
288288
end
289289
end
290290
end
291291

292-
defp validate([], values1, values2, acc, []) do
293-
{:ok, move_pairs!(values1, move_pairs!(values2, acc))}
292+
defp validate([], values1, values2, original, []) do
293+
{:ok, move_pairs!(values1, move_pairs!(values2, original))}
294294
end
295295

296-
defp validate([], _values1, _values2, _acc, bad_keys) do
296+
defp validate([], _values1, _values2, _original, bad_keys) do
297297
{:error, bad_keys}
298298
end
299299

300-
defp validate([pair | _], _values1, _values2, _acc, []) do
300+
defp validate([pair | _], _values1, _values2, _original, []) do
301301
raise ArgumentError,
302302
"expected a keyword list as first argument, got invalid entry: #{inspect(pair)}"
303303
end

0 commit comments

Comments
 (0)