--- /dev/null
+
+-- | Computations in the vectorisation monad concerned with naming
+-- and fresh variable generation.
+module Vectorise.Monad.Naming
+ ( cloneName
+ , cloneId
+ , cloneVar
+ , newExportedVar
+ , newLocalVar
+ , newLocalVars
+ , newDummyVar
+ , newTyVar)
+where
+import Vectorise.Monad.Base
+
+import DsMonad
+import Type
+import Var
+import OccName
+import Name
+import SrcLoc
+import Id
+import FastString
+import Control.Monad
+
+
+-- Naming ---------------------------------------------------------------------
+-- | Clone a name, using the provide function to transform its `OccName`.
+cloneName :: (OccName -> OccName) -> Name -> VM Name
+cloneName mk_occ name = liftM make (liftDs newUnique)
+ where
+ occ_name = mk_occ (nameOccName name)
+
+ make u | isExternalName name = mkExternalName u (nameModule name)
+ occ_name
+ (nameSrcSpan name)
+ | otherwise = mkSystemName u occ_name
+
+
+-- | Clone an `Id`, using the provided function to transform its `OccName`.
+cloneId :: (OccName -> OccName) -> Id -> Type -> VM Id
+cloneId mk_occ id ty
+ = do
+ name <- cloneName mk_occ (getName id)
+ let id' | isExportedId id = Id.mkExportedLocalId name ty
+ | otherwise = Id.mkLocalId name ty
+ return id'
+
+
+-- | Make a fresh instance of this var, with a new unique.
+cloneVar :: Var -> VM Var
+cloneVar var = liftM (setIdUnique var) (liftDs newUnique)
+
+
+-- | Make a fresh exported variable with the given type.
+newExportedVar :: OccName -> Type -> VM Var
+newExportedVar occ_name ty
+ = do mod <- liftDs getModuleDs
+ u <- liftDs newUnique
+
+ let name = mkExternalName u mod occ_name noSrcSpan
+
+ return $ Id.mkExportedLocalId name ty
+
+
+-- | Make a fresh local variable with the given type.
+-- The variable's name is formed using the given string as the prefix.
+newLocalVar :: FastString -> Type -> VM Var
+newLocalVar fs ty
+ = do u <- liftDs newUnique
+ return $ mkSysLocal fs u ty
+
+
+-- | Make several fresh local varaiables with the given types.
+-- The variable's names are formed using the given string as the prefix.
+newLocalVars :: FastString -> [Type] -> VM [Var]
+newLocalVars fs = mapM (newLocalVar fs)
+
+
+-- | Make a new local dummy variable.
+newDummyVar :: Type -> VM Var
+newDummyVar = newLocalVar (fsLit "vv")
+
+
+-- | Make a fresh type variable with the given kind.
+-- The variable's name is formed using the given string as the prefix.
+newTyVar :: FastString -> Kind -> VM Var
+newTyVar fs k
+ = do u <- liftDs newUnique
+ return $ mkTyVar (mkSysTvName u fs) k
+