lens-5.2.3: src/System/Exit/Lens.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
-----------------------------------------------------------------------------
-- |
-- Module : System.Exit.Lens
-- Copyright : (C) 2013-16 Edward Kmett
-- License : BSD-style (see the file LICENSE)
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- Stability : provisional
-- Portability : Control.Exception
--
-- These prisms can be used with the combinators in "Control.Exception.Lens".
----------------------------------------------------------------------------
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
-- | Exit codes that a program can return with:
class AsExitCode t where
_ExitCode :: Prism' t ExitCode
instance AsExitCode ExitCode where
_ExitCode = id
{-# INLINE _ExitCode #-}
instance AsExitCode SomeException where
_ExitCode = exception
{-# INLINE _ExitCode #-}
-- | indicates successful termination;
--
-- @
-- '_ExitSuccess' :: 'Prism'' 'ExitCode' ()
-- '_ExitSuccess' :: 'Prism'' 'SomeException' ()
-- @
_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 #-}
-- | indicates program failure with an exit code. The exact interpretation of the code is operating-system dependent. In particular, some values may be prohibited (e.g. 0 on a POSIX-compliant system).
--
-- @
-- '_ExitFailure' :: 'Prism'' 'ExitCode' 'Int'
-- '_ExitFailure' :: 'Prism'' 'SomeException' 'Int'
-- @
_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