@@ -437,13 +437,13 @@ elab ist info pattern tm
437437 ivs <- get_instances
438438 try (do ns <- apply (Var f) (map isph args)
439439 solve
440− elabArgs ns (map (\x -> (lazyarg x, getTm x)) args))
440+ elabArgs [] True ns (map (\x -> (lazyarg x, getTm x)) args))
441441 (do apply_elab f (map toElab args)
442442 solve)
443443 ivs' <- get_instances
444444 when (not pattern) $
445445 mapM_ (\n -> do focus n
446− resolveTC ist) (ivs' \\ ivs)
446+ resolveTC 10 ist) (ivs' \\ ivs)
447447-- ivs <- get_instances
448448-- when (not (null ivs)) $
449449-- do t <- get_term
@@ -464,16 +464,22 @@ elab ist info pattern tm
464464 elab' (PElabError e) = fail e
465465 elab' x = fail $ "Not implemented " ++ show x
466466
467− elabArgs [] _ = return ()
468− elabArgs (n:ns) ((_, Placeholder) : args) = elabArgs ns args
469− elabArgs (n:ns) ((lazy, t) : args)
470− | lazy && not pattern
471− = do focus n; elab' (PApp bi (PRef bi (UN ["lazy"]))
472− [pimp (UN ["a"]) Placeholder,
473− pexp t]);
474− elabArgs ns args
475− | otherwise
476− = do focus n; elabE t; elabArgs ns args
467+ elabArgs failed retry [] _
468+ | retry = let (ns, ts) = unzip (reverse failed) in
469+ elabArgs [] False ns ts
470+ | otherwise = return ()
471+ elabArgs failed r (n:ns) ((_, Placeholder) : args)
472+ = elabArgs failed r ns args
473+ elabArgs failed r (n:ns) ((lazy, t) : args)
474+ | lazy && not pattern
475+ = do elabArg n (PApp bi (PRef bi (UN ["lazy"]))
476+ [pimp (UN ["a"]) Placeholder,
477+ pexp t]);
478+ | otherwise = elabArg n t
479+ where elabArg n t = if r
480+ then try (do focus n; elabE t; elabArgs failed r ns args)
481+ (elabArgs ((n,(lazy, t)):failed) r ns args)
482+ else do focus n; elabE t; elabArgs failed r ns args
477483
478484trivial :: IState -> Elab ()
479485trivial 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)))
484490 tryAll (x:xs) = try (elab ist toplevel False (PRef (FC "prf" 0) x))
485491 (tryAll xs)
486492
487−resolveTC :: IState -> Elab ()
488−resolveTC ist = do t <- goal
493+resolveTC :: Int -> IState -> Elab ()
494+resolveTC depth ist
495+ = do t <- goal
489496 tm <- get_term
490497 try (trivial ist)
491498 (blunderbuss t (map fst (toAlist (tt_ctxt ist))))
492499 where
493500 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)
495502 (blunderbuss t ns)
496503 | otherwise = blunderbuss t ns
497504 tcname (UN (('@':_) : _)) = True
498505 tcname _ = False
499506
500− resolve n = do t <- goal
507+ resolve n depth
508+ | depth == 0 = fail $ "Can't resolve type class"
509+ | otherwise
510+ = do t <- goal
501511 let imps = case lookupCtxt n (idris_implicits ist) of
502512 Nothing -> []
503513 Just args -> map isImp args
504514 args <- apply (Var n) imps
505515 mapM_ (\ (_,n) -> do focus n
506− resolveTC ist)
516+ resolveTC (depth - 1) ist)
507517 (filter (\ (x, y) -> not x) (zip imps args))
508518 solve
509519 where isImp (PImp _ _ _) = True