{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
#if __GLASGOW_HASKELL__ >= 710
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
#endif
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(x,y,z) 1
#endif
module System.Exit.Lens
( AsExitCode(..)
, _ExitFailure
, _ExitSuccess
#if __GLASGOW_HASKELL__ >= 710
, pattern ExitFailure_
, pattern ExitSuccess_
#endif
) where
import Control.Exception
import Control.Exception.Lens
import Control.Lens
import System.Exit
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
class AsExitCode t where
_ExitCode :: Prism' t ExitCode
instance AsExitCode ExitCode where
_ExitCode = id
{-# INLINE _ExitCode #-}
instance AsExitCode SomeException where
_ExitCode = exception
{-# INLINE _ExitCode #-}
_ExitSuccess :: AsExitCode t => Prism' t ()
_ExitSuccess = _ExitCode . dimap seta (either id id) . right' . rmap (ExitSuccess <$) where
seta ExitSuccess = Right ()
seta t = Left (pure t)
{-# INLINE _ExitSuccess #-}
_ExitFailure :: AsExitCode t => Prism' t Int
_ExitFailure = _ExitCode . dimap seta (either id id) . right' . rmap (fmap ExitFailure) where
seta (ExitFailure i) = Right i
seta t = Left (pure t)
{-# INLINE _ExitFailure #-}
#if __GLASGOW_HASKELL__ >= 710
pattern ExitSuccess_ <- (has _ExitSuccess -> True) where
ExitSuccess_ = review _ExitSuccess ()
pattern ExitFailure_ a <- (preview _ExitFailure -> Just a) where
ExitFailure_ a = review _ExitFailure a
#endif