@@ -263,25 +263,29 @@ data LexOrder = LexXX | LexEQ | LexLT
263263 deriving (Show, Eq, Ord)
264264
265265calcProd :: IState -> FC -> Name -> [([Name], Term, Term)] -> Idris Totality
266−calcProd i fc n pats
267− | and (map prodRec pats) = return (Total [])
268− | otherwise = return (Partial NotProductive)
266+calcProd i fc n pats = do patsprod <- mapM prodRec pats
267+ if (and patsprod)
268+ then return Productive
269+ else return (Partial NotProductive)
269270 where
270271 -- every application of n must be in an argument of a coinductive constructor
271272
272− prodRec :: ([Name], Term, Term) -> Bool
273+ prodRec :: ([Name], Term, Term) -> Idris Bool
273274 prodRec (_, _, tm) = prod False tm
274275
275276 prod ok ap@(App _ _)
276277 | (P _ (UN "lazy") _, [_, arg]) <- unApply ap = prod ok arg
277278 | (P _ f ty, args) <- unApply ap
278279 = let co = cotype ty in
279− if f == n then and (ok : map (prod co) args)
280− else and (map (prod co) args)
281− prod ok (App f a) = prod False f && prod False a
282− prod ok (Bind _ (Let t v) sc) = prod False v && prod False v
280+ if f == n
281+ then do argsprod <- mapM (prod co) args
282+ return (and (ok : argsprod) )
283+ else do argsprod <- mapM (prod co) args
284+ return (and argsprod)
285+ prod ok (App f a) = liftM2 (&&) (prod False f) (prod False a)
286+ prod ok (Bind _ (Let t v) sc) = liftM2 (&&) (prod False v) (prod False v)
283287 prod ok (Bind _ b sc) = prod False sc
284− prod ok t = True
288+ prod ok t = return True
285289
286290 cotype ty
287291 | (P _ t _, _) <- unApply (getRetTy ty)
@@ -407,6 +411,7 @@ checkTotality path fc n
407411 if TotalFn `elem` opts
408412 then case t' of
409413 Total _ -> return t'
414+ Productive -> return t'
410415 e -> totalityError t'
411416 else return t'
412417 where