Credence.Pattern.PreferReduceWhileWithHaltValue (credence v0.8.0)

Copy Markdown

Detects Enum.reduce_while/3 that carries a boolean flag in the accumulator solely to signal whether to halt, when the halt value itself could convey the answer directly.

Bad

{_prefix_sum, _seen_sums, found?} =
  Enum.reduce_while(list, {0, MapSet.new([0]), false}, fn num, {ps, ss, _f} ->
    new_sum = ps + num

    if MapSet.member?(ss, new_sum) do
      {:halt, {new_sum, ss, true}}
    else
      {:cont, {new_sum, MapSet.put(ss, new_sum), false}}
    end
  end)

found?

Good

Enum.reduce_while(list, {0, MapSet.new([0])}, fn num, {ps, ss} ->
  new_sum = ps + num

  if MapSet.member?(ss, new_sum) do
    {:halt, true}
  else
    {:cont, {new_sum, MapSet.put(ss, new_sum)}}
  end
end)
|> case do
  true -> true
  {_, _} -> false
end

Auto-fix

Removes the boolean flag from the accumulator, callback parameters, and halt/continue tuples. Replaces the post-reduce extraction of the flag with a pipe into case that distinguishes the halt value (true) from a normal tuple result.