{-# LANGUAGE FlexibleContexts #-} module CommandLine.Helpers where import Control.Monad.Error import System.Directory import System.IO import qualified Elm.Utils as Utils yesOrNo :: IO Bool yesOrNo = do hFlush stdout input <- getLine case input of "y" -> return True "n" -> return False _ -> do putStr "Must type 'y' for yes or 'n' for no: " yesOrNo inDir :: (MonadError String m, MonadIO m) => FilePath -> m a -> m a inDir dir doStuff = do here <- liftIO $ getCurrentDirectory liftIO $ createDirectoryIfMissing True dir liftIO $ setCurrentDirectory dir result <- doStuff liftIO $ setCurrentDirectory here return result git :: (MonadError String m, MonadIO m) => [String] -> m String git = run "git" run :: (MonadError String m, MonadIO m) => String -> [String] -> m String run = Utils.run out :: (MonadIO m) => String -> m () out string = liftIO $ hPutStrLn stdout string' where string' = if not (null string) && last string == '\n' then init string else string