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
endAuto-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.