module Manager where import Control.Monad.Error import Control.Monad.Reader import qualified System.Directory as Dir import System.FilePath (()) type Manager = ErrorT String (ReaderT Environment IO) run :: Environment -> Manager a -> IO (Either String a) run environment manager = runReaderT (runErrorT manager) environment data Environment = Environment { catalog :: String , cacheDirectory :: FilePath } defaultEnvironment :: IO Environment defaultEnvironment = do cacheDirectory <- getCacheDirectory return (Environment "http://package.elm-lang.org" cacheDirectory) getCacheDirectory :: IO FilePath getCacheDirectory = do root <- Dir.getAppUserDataDirectory "elm" let dir = root "package" Dir.createDirectoryIfMissing True dir return dir