@@ -21,7 +21,7 @@ import Control.Applicative
21import Control.Monad.State
21import Control.Monad.State
22import Control.Monad.Error(throwError)
22import Control.Monad.Error(throwError)
24−import Data.List
24+import Data.List hiding (insert,union)
25import Data.Char
25import Data.Char
26import qualified Data.Text as T
26import qualified Data.Text as T
27import Data.Either
27import Data.Either
@@ -498,7 +498,7 @@ addDeferredTyCon = addDeferred' (TCon 0 0)
499addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
499addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
500addDeferred' nt ns
500addDeferred' 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
502 mapM_ (\(n, _) -> when (not (n `elem` primDefs)) $ addIBC (IBCMetavar n)) ns
502 mapM_ (\(n, _) -> when (not (n `elem` primDefs)) $ addIBC (IBCMetavar n)) ns
503 i <- getIState
503 i <- getIState
504 putIState $ i { idris_metavars = map (\(n, (i, top, _, isTopLevel)) -> (n, (top, i, isTopLevel))) ns ++
504 putIState $ i { idris_metavars = map (\(n, (i, top, _, isTopLevel)) -> (n, (top, i, isTopLevel))) ns ++
@@ -507,11 +507,11 @@ addDeferred' nt ns
507 -- 'tidyNames' is to generate user accessible names in case they are
507 -- 'tidyNames' is to generate user accessible names in case they are
508 -- needed in tactic scripts
508 -- needed in tactic scripts
509 tidyNames used (Bind (MN i x) b sc)
509 tidyNames used (Bind (MN i x) b sc)
510− = let n' = uniqueName (UN x) used in
510+ = let n' = uniqueNameSet (UN x) used in
511− Bind n' b $ tidyNames (n':used) sc
511+ Bind n' b $ tidyNames (S.insert n' used) sc
512 tidyNames used (Bind n b sc)
512 tidyNames used (Bind n b sc)
513− = let n' = uniqueName n used in
513+ = let n' = uniqueNameSet n used in
514− Bind n' b $ tidyNames (n':used) sc
514+ Bind n' b $ tidyNames (S.insert n' used) sc
515 tidyNames used b = b
515 tidyNames used b = b
517solveDeferred :: Name -> Idris ()
517solveDeferred :: Name -> Idris ()
@@ -1909,8 +1909,9 @@ shadow n n' t = sm t where
1909-- about with shadowing anywhere else).
1909-- about with shadowing anywhere else).
1911mkUniqueNames :: [Name] -> PTerm -> PTerm
1911mkUniqueNames :: [Name] -> PTerm -> PTerm
1912−mkUniqueNames env tm = evalState (mkUniq tm) env where
1912+mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1913+ inScope :: S.Set Name
1913− inScope = boundNamesIn tm
1914+ inScope = S.fromList $ boundNamesIn tm
1915 mkUniqA arg = do t' <- mkUniq (getTm arg)
1916 mkUniqA arg = do t' <- mkUniq (getTm arg)
1916 return (arg { getTm = t' })
1917 return (arg { getTm = t' })
@@ -1925,40 +1926,40 @@ mkUniqueNames env tm = evalState (mkUniq tm) env where
1925 -- long as there are no bindings inside tactics though.
1926 -- long as there are no bindings inside tactics though.
1926 mkUniqT tac = return tac
1927 mkUniqT tac = return tac
1928− mkUniq :: PTerm -> State [Name] PTerm
1929+ mkUniq :: PTerm -> State (S.Set Name) PTerm
1929 mkUniq (PLam n ty sc)
1930 mkUniq (PLam n ty sc)
1930 = do env <- get
1931 = do env <- get
1931 (n', sc') <-
1932 (n', sc') <-
1932− if n `elem` env
1933+ if n `S.member` env
1933− then do let n' = uniqueName (initN n (length env))
1934+ then do let n' = uniqueNameSet (initN n (S.size env))
1934− (env ++ inScope)
1935+ (S.union env inScope)
1935 return (n', shadow n n' sc)
1936 return (n', shadow n n' sc)
1936 else return (n, sc)
1937 else return (n, sc)
1937− put (n' : env)
1938+ put (S.insert n' env)
1938 ty' <- mkUniq ty
1939 ty' <- mkUniq ty
1939 sc'' <- mkUniq sc'
1940 sc'' <- mkUniq sc'
1940 return $! PLam n' ty' sc''
1941 return $! PLam n' ty' sc''
1941 mkUniq (PPi p n ty sc)
1942 mkUniq (PPi p n ty sc)
1942 = do env <- get
1943 = do env <- get
1943 (n', sc') <-
1944 (n', sc') <-
1944− if n `elem` env
1945+ if n `S.member` env
1945− then do let n' = uniqueName (initN n (length env))
1946+ then do let n' = uniqueNameSet (initN n (S.size env))
1946− (env ++ inScope)
1947+ (S.union env inScope)
1947 return (n', shadow n n' sc)
1948 return (n', shadow n n' sc)
1948 else return (n, sc)
1949 else return (n, sc)
1949− put (n' : env)
1950+ put (S.insert n' env)
1950 ty' <- mkUniq ty
1951 ty' <- mkUniq ty
1951 sc'' <- mkUniq sc'
1952 sc'' <- mkUniq sc'
1952 return $! PPi p n' ty' sc''
1953 return $! PPi p n' ty' sc''
1953 mkUniq (PLet n ty val sc)
1954 mkUniq (PLet n ty val sc)
1954 = do env <- get
1955 = do env <- get
1955 (n', sc') <-
1956 (n', sc') <-
1956− if n `elem` env
1957+ if n `S.member` env
1957− then do let n' = uniqueName (initN n (length env))
1958+ then do let n' = uniqueNameSet (initN n (S.size env))
1958− (env ++ inScope)
1959+ (S.union env inScope)
1959 return (n', shadow n n' sc)
1960 return (n', shadow n n' sc)
1960 else return (n, sc)
1961 else return (n, sc)
1961− put (n' : env)
1962+ put (S.insert n' env)
1962 ty' <- mkUniq ty; val' <- mkUniq val
1963 ty' <- mkUniq ty; val' <- mkUniq val
1963 sc'' <- mkUniq sc'
1964 sc'' <- mkUniq sc'
1964 return $! PLet n' ty' val' sc''
1965 return $! PLet n' ty' val' sc''
@@ -1981,11 +1982,11 @@ mkUniqueNames env tm = evalState (mkUniq tm) env where
1981 mkUniq (PDPair fc p (PRef fc' n) t sc)
1982 mkUniq (PDPair fc p (PRef fc' n) t sc)
1982 | t /= Placeholder
1983 | t /= Placeholder
1983 = do env <- get
1984 = do env <- get
1984− (n', sc') <- if n `elem` env
1985+ (n', sc') <- if n `S.member` env
1985− then do let n' = uniqueName n (env ++ inScope)
1986+ then do let n' = uniqueNameSet n (S.union env inScope)
1986 return (n', shadow n n' sc)
1987 return (n', shadow n n' sc)
1987 else return (n, sc)
1988 else return (n, sc)
1988− put (n' : env)
1989+ put (S.insert n' env)
1989 t' <- mkUniq t
1990 t' <- mkUniq t
1990 sc'' <- mkUniq sc'
1991 sc'' <- mkUniq sc'
1991 return $! PDPair fc p (PRef fc' n') t' sc''
1992 return $! PDPair fc p (PRef fc' n') t' sc''