@@ -21,7 +21,7 @@ import Control.Applicative
2121import Control.Monad.State
2222import Control.Monad.Error(throwError)
2323
24−import Data.List
24+import Data.List hiding (insert,union)
2525import Data.Char
2626import qualified Data.Text as T
2727import Data.Either
@@ -498,7 +498,7 @@ addDeferredTyCon = addDeferred' (TCon 0 0)
498498
499499addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
500500addDeferred' nt ns
501− = do mapM_ (\(n, (i, _, t, _)) -> updateContext (addTyDecl n nt (tidyNames [] t))) ns
501+ = do mapM_ (\(n, (i, _, t, _)) -> updateContext (addTyDecl n nt (tidyNames S.empty t))) ns
502502 mapM_ (\(n, _) -> when (not (n `elem` primDefs)) $ addIBC (IBCMetavar n)) ns
503503 i <- getIState
504504 putIState $ i { idris_metavars = map (\(n, (i, top, _, isTopLevel)) -> (n, (top, i, isTopLevel))) ns ++
@@ -507,11 +507,11 @@ addDeferred' nt ns
507507 -- 'tidyNames' is to generate user accessible names in case they are
508508 -- needed in tactic scripts
509509 tidyNames used (Bind (MN i x) b sc)
510− = let n' = uniqueName (UN x) used in
511− Bind n' b $ tidyNames (n':used) sc
510+ = let n' = uniqueNameSet (UN x) used in
511+ Bind n' b $ tidyNames (S.insert n' used) sc
512512 tidyNames used (Bind n b sc)
513− = let n' = uniqueName n used in
514− Bind n' b $ tidyNames (n':used) sc
513+ = let n' = uniqueNameSet n used in
514+ Bind n' b $ tidyNames (S.insert n' used) sc
515515 tidyNames used b = b
516516
517517solveDeferred :: Name -> Idris ()
@@ -1909,8 +1909,9 @@ shadow n n' t = sm t where
19091909-- about with shadowing anywhere else).
19101910
19111911mkUniqueNames :: [Name] -> PTerm -> PTerm
1912−mkUniqueNames env tm = evalState (mkUniq tm) env where
1913− inScope = boundNamesIn tm
1912+mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1913+ inScope :: S.Set Name
1914+ inScope = S.fromList $ boundNamesIn tm
19141915
19151916 mkUniqA arg = do t' <- mkUniq (getTm arg)
19161917 return (arg { getTm = t' })
@@ -1925,40 +1926,40 @@ mkUniqueNames env tm = evalState (mkUniq tm) env where
19251926 -- long as there are no bindings inside tactics though.
19261927 mkUniqT tac = return tac
19271928
1928− mkUniq :: PTerm -> State [Name] PTerm
1929+ mkUniq :: PTerm -> State (S.Set Name) PTerm
19291930 mkUniq (PLam n ty sc)
19301931 = do env <- get
19311932 (n', sc') <-
1932− if n `elem` env
1933− then do let n' = uniqueName (initN n (length env))
1934− (env ++ inScope)
1933+ if n `S.member` env
1934+ then do let n' = uniqueNameSet (initN n (S.size env))
1935+ (S.union env inScope)
19351936 return (n', shadow n n' sc)
19361937 else return (n, sc)
1937− put (n' : env)
1938+ put (S.insert n' env)
19381939 ty' <- mkUniq ty
19391940 sc'' <- mkUniq sc'
19401941 return $! PLam n' ty' sc''
19411942 mkUniq (PPi p n ty sc)
19421943 = do env <- get
19431944 (n', sc') <-
1944− if n `elem` env
1945− then do let n' = uniqueName (initN n (length env))
1946− (env ++ inScope)
1945+ if n `S.member` env
1946+ then do let n' = uniqueNameSet (initN n (S.size env))
1947+ (S.union env inScope)
19471948 return (n', shadow n n' sc)
19481949 else return (n, sc)
1949− put (n' : env)
1950+ put (S.insert n' env)
19501951 ty' <- mkUniq ty
19511952 sc'' <- mkUniq sc'
19521953 return $! PPi p n' ty' sc''
19531954 mkUniq (PLet n ty val sc)
19541955 = do env <- get
19551956 (n', sc') <-
1956− if n `elem` env
1957− then do let n' = uniqueName (initN n (length env))
1958− (env ++ inScope)
1957+ if n `S.member` env
1958+ then do let n' = uniqueNameSet (initN n (S.size env))
1959+ (S.union env inScope)
19591960 return (n', shadow n n' sc)
19601961 else return (n, sc)
1961− put (n' : env)
1962+ put (S.insert n' env)
19621963 ty' <- mkUniq ty; val' <- mkUniq val
19631964 sc'' <- mkUniq sc'
19641965 return $! PLet n' ty' val' sc''
@@ -1981,11 +1982,11 @@ mkUniqueNames env tm = evalState (mkUniq tm) env where
19811982 mkUniq (PDPair fc p (PRef fc' n) t sc)
19821983 | t /= Placeholder
19831984 = do env <- get
1984− (n', sc') <- if n `elem` env
1985− then do let n' = uniqueName n (env ++ inScope)
1985+ (n', sc') <- if n `S.member` env
1986+ then do let n' = uniqueNameSet n (S.union env inScope)
19861987 return (n', shadow n n' sc)
19871988 else return (n, sc)
1988− put (n' : env)
1989+ put (S.insert n' env)
19891990 t' <- mkUniq t
19901991 sc'' <- mkUniq sc'
19911992 return $! PDPair fc p (PRef fc' n') t' sc''