@@ -1,6 +1,7 @@
11{-# LANGUAGE PatternGuards #-}
22
3−module Idris.Core.Unify(match_unify, unify, Fails, FailContext(..), FailAt(..)) where
3+module Idris.Core.Unify(match_unify, unify, Fails, FailContext(..), FailAt(..),
4+ unrecoverable) where
45
56import Idris.Core.TT
67import Idris.Core.Evaluate
@@ -30,6 +31,16 @@ data FailContext = FailContext { fail_sourceloc :: FC,
3031type Injs = [(TT Name, TT Name, TT Name)]
3132type Fails = [(TT Name, TT Name, Env, Err, [FailContext], FailAt)]
3233
34+unrecoverable :: Fails -> Bool
35+unrecoverable = any bad
36+ where bad (_,_,_, err, _, _) = unrec err
37+
38+ unrec (CantUnify r _ _ _ _ _) = not r
39+ unrec (At _ e) = unrec e
40+ unrec (Elaborating _ _ e) = unrec e
41+ unrec (ElaboratingArg _ _ _ e) = unrec e
42+ unrec _ = False
43+
3344data UInfo = UI Int Fails
3445 deriving Show
3546
@@ -628,6 +639,8 @@ recoverable p@(Constant _) (App f a) = recoverable p f
628639recoverable (App f a) p@(Constant _) = recoverable f p
629640recoverable p@(P _ n _) (App f a) = recoverable p f
630641recoverable (App f a) p@(P _ _ _) = recoverable f p
642+recoverable (App f a) (App f' a')
643+ | f == f' = recoverable a a'
631644recoverable (App f a) (App f' a')
632645 = recoverable f f' -- && recoverable a a'
633646recoverable f (Bind _ (Pi _) sc)