@@ -437,13 +437,13 @@ elab ist info pattern tm
437 ivs <- get_instances
437 ivs <- get_instances
438 try (do ns <- apply (Var f) (map isph args)
438 try (do ns <- apply (Var f) (map isph args)
440− elabArgs ns (map (\x -> (lazyarg x, getTm x)) args))
440+ elabArgs [] True ns (map (\x -> (lazyarg x, getTm x)) args))
441 (do apply_elab f (map toElab args)
441 (do apply_elab f (map toElab args)
443 ivs' <- get_instances
443 ivs' <- get_instances
444 when (not pattern) $
444 when (not pattern) $
445 mapM_ (\n -> do focus n
445 mapM_ (\n -> do focus n
446− resolveTC ist) (ivs' \\ ivs)
446+ resolveTC 10 ist) (ivs' \\ ivs)
447-- ivs <- get_instances
447-- ivs <- get_instances
448-- when (not (null ivs)) $
448-- when (not (null ivs)) $
449-- do t <- get_term
449-- do t <- get_term
@@ -464,16 +464,22 @@ elab ist info pattern tm
464 elab' (PElabError e) = fail e
464 elab' (PElabError e) = fail e
465 elab' x = fail $ "Not implemented " ++ show x
465 elab' x = fail $ "Not implemented " ++ show x
467− elabArgs [] _ = return ()
467+ elabArgs failed retry [] _
468+ | retry = let (ns, ts) = unzip (reverse failed) in
469+ elabArgs [] False ns ts
470+ | otherwise = return ()
468− elabArgs (n:ns) ((_, Placeholder) : args) = elabArgs ns args
471+ elabArgs failed r (n:ns) ((_, Placeholder) : args)
472+ = elabArgs failed r ns args
469− elabArgs (n:ns) ((lazy, t) : args)
473+ elabArgs failed r (n:ns) ((lazy, t) : args)
470− | lazy && not pattern
474+ | lazy && not pattern
471− = do focus n; elab' (PApp bi (PRef bi (UN ["lazy"]))
475+ = do elabArg n (PApp bi (PRef bi (UN ["lazy"]))
472− [pimp (UN ["a"]) Placeholder,
476+ [pimp (UN ["a"]) Placeholder,
473− pexp t]);
477+ pexp t]);
478+ | otherwise = elabArg n t
479+ where elabArg n t = if r
474− elabArgs ns args
480+ then try (do focus n; elabE t; elabArgs failed r ns args)
475− | otherwise
481+ (elabArgs ((n,(lazy, t)):failed) r ns args)
476− = do focus n; elabE t; elabArgs ns args
482+ else do focus n; elabE t; elabArgs failed r ns args
478trivial :: IState -> Elab ()
484trivial :: IState -> Elab ()
479trivial ist = try (elab ist toplevel False (PRefl (FC "prf" 0)))
485trivial ist = try (elab ist toplevel False (PRefl (FC "prf" 0)))
@@ -484,26 +490,30 @@ trivial ist = try (elab ist toplevel False (PRefl (FC "prf" 0)))
484 tryAll (x:xs) = try (elab ist toplevel False (PRef (FC "prf" 0) x))
490 tryAll (x:xs) = try (elab ist toplevel False (PRef (FC "prf" 0) x))
485 (tryAll xs)
491 (tryAll xs)
487−resolveTC :: IState -> Elab ()
493+resolveTC :: Int -> IState -> Elab ()
488−resolveTC ist = do t <- goal
494+resolveTC depth ist
489 tm <- get_term
496 tm <- get_term
490 try (trivial ist)
497 try (trivial ist)
491 (blunderbuss t (map fst (toAlist (tt_ctxt ist))))
498 (blunderbuss t (map fst (toAlist (tt_ctxt ist))))
493 blunderbuss t [] = fail $ "Can't resolve type class " ++ show t
500 blunderbuss t [] = fail $ "Can't resolve type class " ++ show t
494− blunderbuss t (n:ns) | tcname n = try (resolve n)
501+ blunderbuss t (n:ns) | tcname n = try (resolve n depth)
495 (blunderbuss t ns)
502 (blunderbuss t ns)
496 | otherwise = blunderbuss t ns
503 | otherwise = blunderbuss t ns
497 tcname (UN (('@':_) : _)) = True
504 tcname (UN (('@':_) : _)) = True
498 tcname _ = False
505 tcname _ = False
508+ | depth == 0 = fail $ "Can't resolve type class"
500− resolve n = do t <- goal
510+ = do t <- goal
501 let imps = case lookupCtxt n (idris_implicits ist) of
511 let imps = case lookupCtxt n (idris_implicits ist) of
502 Nothing -> []
512 Nothing -> []
503 Just args -> map isImp args
513 Just args -> map isImp args
504 args <- apply (Var n) imps
514 args <- apply (Var n) imps
505 mapM_ (\ (_,n) -> do focus n
515 mapM_ (\ (_,n) -> do focus n
506− resolveTC ist)
516+ resolveTC (depth - 1) ist)
507 (filter (\ (x, y) -> not x) (zip imps args))
517 (filter (\ (x, y) -> not x) (zip imps args))
509 where isImp (PImp _ _ _) = True
519 where isImp (PImp _ _ _) = True