Releases
v2.1.0
Compare
Sorry, something went wrong.
No results found
New smell checks
Enum.at/2 inside loop — flags O(n) indexed access inside loops (O(n²) total)
List.delete_at/2 inside loop — same O(n²) concern
Enum.count/1 without predicate — suggests length/1 (avoids protocol dispatch)
Map.put with variable key and boolean — suggests MapSet for membership tracking
Map.values → Enum.all?/any?/find/filter/map — iterate the map directly
Enum.map → Enum.max/min/sum — allocates intermediate list; use *_by or reduce
List.foldl/3 — non-idiomatic; use Enum.reduce/3
String.graphemes → Enum.reverse → Enum.join — use String.reverse/1
Redundant negated guard — when x != y after when x == y on same variables
Destructure then reconstruct — [a, b, c] pattern reassembled as [a, b, c] in body
Fixed
Frontend crash on import Mod, only: :macros — atom values are now handled correctly
Frontend crash on macro-generated AST — bare atoms in with clauses, non-list else clauses, and non-list handler clauses no longer crash
Enum.count/1 false positive — piped predicate form (|> Enum.count(&pred)) no longer flagged
Dogfooded own smells — fixed 50 findings in Reach's own code
Improved
Stress-tested on 4500+ Hex packages with zero crashes
You can’t perform that action at this time.