Custom Credo checks targeting Enum anti-patterns that LLMs commonly produce.
Stock Credo ships checks for filter |> filter, reject |> reject,
map |> join, map |> into, etc. but not the cases where one operation
composes with the complementary one, nor the common map-building and
sort-then-pick anti-patterns. These checks fill those gaps.
Two-pass Enum chains (suggests Enum.reduce/3)
ForgeCredoChecks.FilterMap:Enum.filter |> Enum.mapForgeCredoChecks.RejectMap:Enum.reject |> Enum.mapForgeCredoChecks.MapReject:Enum.map |> Enum.rejectForgeCredoChecks.MapRejectNil:Enum.map |> Enum.reject(&is_nil/1)
Hand-rolled map building (suggests Map.new/2)
ForgeCredoChecks.MapNewFromInto:Enum.into(%{}, fn ...)ForgeCredoChecks.MapNewFromReduce:Enum.reduce(_, %{}, &Map.put(acc, k, v))
Wasteful list-extremum patterns
ForgeCredoChecks.ReverseListFirst:xs |> Enum.reverse() |> List.first()becomesList.last(xs)ForgeCredoChecks.SortListFirst:Enum.sort \| List.firstbecomesEnum.min/Enum.max/*_by