Credence.Rule.NoManualEnumUniq (credence v0.3.2)

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)