shell-utility-0.0: src/Shell/Utility/Exit.hs
{- |
The Exit mechanism is not compositional
and thus should not be used in larger long-running programs.
However, in small command-line utilities
and especially for signaling errors in command-line arguments
it is acceptable.
The 'IO' instance is useful for 'GetOpt' and immediate exit.
The 'Either' instance is useful for 'Optparse.Applicative.eitherReader'.
-}
module Shell.Utility.Exit where
import qualified System.Exit as Exit
import qualified System.IO as IO
import Control.Applicative (Applicative)
import Data.String (IsString, fromString)
class Applicative f => Exit f where
{- |
Also known as 'System.Exit.die' in newer versions of 'base'.
-}
exitFailureMsg :: String -> f a
instance Exit IO where
exitFailureMsg msg = do
IO.hPutStrLn IO.stderr msg
Exit.exitFailure
instance (IsString str) => Exit (Either str) where
exitFailureMsg = Left . fromString