Credence.Pattern.NoListDeleteAtInLoop
(credence v0.5.0)
Copy Markdown
Performance rule: Detects List.delete_at/2 inside looping constructs
(for, Enum.reduce, Enum.map, Enum.flat_map) or recursive functions.
List.delete_at/2 is O(n) because it must traverse the linked list to the
given index. Inside a loop this compounds to O(n²) per iteration.
Bad
for {elem, idx} <- Enum.with_index(list) do
rest = List.delete_at(list, idx)
[elem | permutations(rest)]
endGood
# Use List.delete/2 or pass remaining elements via pattern matching
defp permutations([]), do: [[]]
defp permutations(list) do
for elem <- list do
rest = List.delete(list, elem)
for perm <- permutations(rest), do: [elem | perm]
end |> List.flatten()
end