module Unique ( UniqueFactory , freshUniques , genUnique , Unique , uniqueSymbol , uniquePattern , substituteUnique , multipleOccurances ) where import Data.Generics.Aliases import Data.Generics.Schemes import Language.Haskell.Exts.Syntax newtype UniqueFactory = UniqueFactory Integer newtype Unique = Unique Integer deriving (Eq,Ord) freshUniques :: UniqueFactory freshUniques = UniqueFactory 0 genUnique :: UniqueFactory -> (Unique,UniqueFactory) genUnique (UniqueFactory c) = (Unique c, UniqueFactory (succ c)) uniqueSymbol :: Unique -> Exp () uniqueSymbol (Unique i) = Var () (UnQual () (Ident () (showSym i))) uniquePattern :: Unique -> Pat () uniquePattern (Unique i) = PVar () (Ident () (showSym i)) showSym :: Integer -> String showSym i = " u" ++ show i substituteUnique :: Unique -> Exp () -> Exp () -> Exp () substituteUnique u inner outer = everywhere (mkT $ subst inner) outer where subst x t | t == uniqueSymbol u = x | otherwise = t multipleOccurances :: Unique -> Exp () -> Bool multipleOccurances u x = case listify (== uniqueSymbol u) x of (x:y:ys) -> True _ -> False