{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
module System.Exit.Lens
( AsExitCode(..)
, _ExitFailure
, _ExitSuccess
, pattern ExitFailure_
, pattern ExitSuccess_
) where
import Prelude ()
import Control.Exception
import Control.Exception.Lens
import Control.Lens
import Control.Lens.Internal.Prelude
import System.Exit
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 #-}
pattern ExitSuccess_ :: AsExitCode s => s
pattern ExitSuccess_ <- (has _ExitSuccess -> True) where
ExitSuccess_ = review _ExitSuccess ()
pattern ExitFailure_ :: AsExitCode s => Int -> s
pattern ExitFailure_ a <- (preview _ExitFailure -> Just a) where
ExitFailure_ a = review _ExitFailure a