@@ -32,6 +32,9 @@ import qualified Reporting.Result as Result
35+-- NITPICK PATTERN MATCHES
35type Result warning a =
38type Result warning a =
36 Result.Result () warning Error.Error a
39 Result.Result () warning Error.Error a
@@ -49,10 +52,6 @@ patternMatches interfaces (Module.Module name _ info) =
49 <* checkExpression arityDict (Module.program info)
52 <* checkExpression arityDict (Module.program info)
56checkExpression :: ArityDict -> C.Expr -> Result wrn ()
55checkExpression :: ArityDict -> C.Expr -> Result wrn ()
57checkExpression arityDict (A.A region expression) =
56checkExpression arityDict (A.A region expression) =
@@ -140,15 +139,32 @@ checkExpression arityDict (A.A region expression) =
141checkPatterns :: ArityDict -> Region.Region -> Error.Origin -> [Pattern.Canonical] -> Result wrn ()
140checkPatterns :: ArityDict -> Region.Region -> Error.Origin -> [Pattern.Canonical] -> Result wrn ()
142checkPatterns arityDict region origin patterns =
141checkPatterns arityDict region origin patterns =
143− let
142+ do matrix <- checkRedundant arityDict region [] patterns
145− map (\p -> [fromCanonicalPattern p]) patterns
147− if isUseful arityDict matrix [Anything] then
143+ if isUseful arityDict matrix [Anything]
148− Result.throw region (Error.Incomplete origin (error "TODO"))
144+ then Result.throw region (Error.Incomplete origin (error "TODO"))
152+ -> [Pattern.Canonical]
153+ -> Result wrn [[Pattern]]
154+checkRedundant arityDict region checked unchecked =
159+ nextPattern@(A.A patRegion _) : rest ->
162+ [fromCanonicalPattern nextPattern]
164+ if isUseful arityDict checked next then
165+ checkRedundant arityDict region (next : checked) rest
151− return ()
167+ Result.throw region (Error.Redundant patRegion (length checked + 1))
@@ -163,7 +179,7 @@ checkPatterns arityDict region origin patterns =
166−-- REDUNDANT PATTERNS
182+-- DETECT USEFUL PATTERNS
169isUseful :: ArityDict -> [[Pattern]] -> [Pattern] -> Bool
185isUseful :: ArityDict -> [[Pattern]] -> [Pattern] -> Bool