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