Credence.Pattern.PreferComprehensionForFilteredRange (credence v0.8.0)

Copy Markdown

Detects Enum.reduce/3 over a range that filters elements into an accumulator list followed by Enum.reverse/1, and rewrites it as a for comprehension with a guard.

This pattern is idiomatic Elixir — a for comprehension with a filter expresses the same intent more clearly and avoids building + reversing an intermediate list.

Bad

Enum.reduce(1..n, [], fn num, missing ->
  if MapSet.member?(present, num), do: missing, else: [num | missing]
end)
|> Enum.reverse()

Good

for num <- 1..n, !MapSet.member?(present, num), do: num