Credence.Pattern.NoListDeleteAtInLoop (credence v0.4.2)

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)]
end

Good

# 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