Credence.Pattern.PreferDescSortOverNegativeTake (credence v0.7.1)

Copy Markdown

Prefer Enum.sort(nums, :desc) |> Enum.take(n) |> Enum.reverse() over Enum.sort(nums) |> Enum.take(-n).

Enum.take(list, -n) must walk the whole list to reach the last n; Enum.take(list, n) stops after n. The trailing Enum.reverse/1 is load-bearing for correctness: sort |> take(-n) returns the n largest in ascending order, while sort(:desc) |> take(n) returns them descending, so the reverse restores the original order. The rewrite is behaviour-preserving and reverses only n elements.

Bad

nums
|> Enum.sort()
|> Enum.take(-3)

Enum.sort(nums) |> Enum.take(-3)

Good

nums
|> Enum.sort(:desc)
|> Enum.take(3)
|> Enum.reverse()

Enum.sort(nums, :desc) |> Enum.take(3) |> Enum.reverse()