@@ -13,6 +13,7 @@ import Idris.Core.Evaluate
1313import Idris.Core.Typecheck
1414
1515import Control.Applicative hiding (Const)
16+import Control.Monad.State
1617import Control.Monad
1718import Data.List
1819
@@ -205,3 +206,33 @@ paramNames args env (p : ps)
205206 else paramNames args env ps
206207 _ -> paramNames args env ps
207208 | otherwise = paramNames args env ps
209+
210+getUniqueUsed :: Context -> Term -> [Name]
211+getUniqueUsed ctxt tm = execState (getUniq [] [] tm) []
212+ where
213+ getUniq :: Env -> [(Name, Bool)] -> Term -> State [Name] ()
214+ getUniq env us (Bind n b sc)
215+ = let uniq = case check ctxt env (forgetEnv (map fst env) (binderTy b)) of
216+ OK (_, UType UniqueType) -> True
217+ OK (_, UType NullType) -> True
218+ OK (_, UType AllTypes) -> True
219+ _ -> False in
220+ do getUniqB env us b
221+ getUniq ((n,b):env) ((n, uniq):us) sc
222+ getUniq env us (App f a) = do getUniq env us f; getUniq env us a
223+ getUniq env us (V i)
224+ | i < length us = if snd (us!!i) then use (fst (us!!i)) else return ()
225+ getUniq env us (P _ n _)
226+ | Just u <- lookup n us = if u then use n else return ()
227+ getUniq env us _ = return ()
228+
229+ use n = do ns <- get; put (n : ns)
230+
231+ getUniqB env us (Let t v) = do getUniq env us t; getUniq env us v
232+ getUniqB env us (Guess t v) = do getUniq env us t; getUniq env us v
233+ getUniqB env us (Pi t v) = do getUniq env us t; getUniq env us v
234+ getUniqB env us (NLet t v) = do getUniq env us t; getUniq env us v
235+ getUniqB env us b = getUniq env us (binderTy b)
236+
237+
238+