Credence.Pattern.NoManualEnumUniq
(credence v0.4.0)
Copy Markdown
Performance and idiomatic code rule: warns when Enum.uniq/1 is manually
reimplemented using Enum.reduce/3 and MapSet.
Lists are deduplicated most efficiently using the built-in Enum.uniq/1
or Enum.uniq_by/2, which are implemented natively.
Bad
Enum.reduce(list, {MapSet.new(), []}, fn item, {seen, acc} ->
if MapSet.member?(seen, item) do
{seen, acc}
else
{MapSet.put(seen, item), [item | acc]}
end
end)
# or in a pipeline:
list
|> Enum.reduce({MapSet.new(), []}, fn item, {seen, acc} ->
if MapSet.member?(seen, item) do
{seen, acc}
else
{MapSet.put(seen, item), [item | acc]}
end
end)
# or with inverted tuple order:
Enum.reduce(list, {[], MapSet.new()}, fn x, {results, tracked} ->
unless MapSet.member?(tracked, x) do
{[x | results], MapSet.put(tracked, x)}
else
{results, tracked}
end
end)Good
Enum.uniq(list)