Credence.Pattern.PreferDescSortOverNegativeTake
(credence v0.7.0)
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()