content: module Paths ( vheDirStructure
               , cabalConfigLocation
               , getVirtualEnvironment
               ) where
  
  import System.FilePath ((</>))
  import System.Directory (getCurrentDirectory)
  import System.Environment (getEnvironment)
  
  import Types
  import MyMonad
  
  -- returns record containing paths to all important directories
  -- inside virtual environment dir structure
  vheDirStructure :: MyMonad DirStructure
  vheDirStructure = do
    cwd <- liftIO getCurrentDirectory
    let virthualEnvLocation    = cwd
        virthualEnvDirLocation = virthualEnvLocation </> ".virthualenv"
        cabalDirLocation       = virthualEnvDirLocation </> "cabal"
        ghcDirLocation         = virthualEnvDirLocation </> "ghc"
    return DirStructure { virthualEnv       = virthualEnvLocation
                        , virthualEnvDir    = virthualEnvDirLocation
                        , ghcPackagePath    = virthualEnvDirLocation </> "ghc_pkg_db"
                        , cabalDir          = cabalDirLocation
                        , cabalBinDir       = cabalDirLocation </> "bin"
                        , virthualEnvBinDir = virthualEnvDirLocation </> "bin"
                        , ghcDir            = ghcDirLocation
                        , ghcBinDir         = ghcDirLocation </> "bin"
                        }
  
  -- returns location of cabal's config file inside virtual environment dir structure
  cabalConfigLocation :: MyMonad FilePath
  cabalConfigLocation = do
    dirStructure <- vheDirStructure
    return $ cabalDir dirStructure </> "config"
  
  -- returns environment dictionary used in Virtual Haskell Environment
  -- it's inherited from the current process, but variable
  -- GHC_PACKAGE_PATH is altered.
  getVirtualEnvironment :: MyMonad [(String, String)]
  getVirtualEnvironment = do
    env <- liftIO getEnvironment
    dirStructure <- vheDirStructure
    return $ ("GHC_PACKAGE_PATH", ghcPackagePath dirStructure) : filter (\(k,_) -> k /= "GHC_PACKAGE_PATH") env
  