{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wall #-}

module Control.Exitcode.Optics
  ( GetExitcode (..),
    HasExitcode (..),
    ReviewExitcode (..),
    AsExitcode (..),
    GetExitcodeBifunctor (..),
    HasExitcodeBifunctor (..),
    ReviewExitcodeBifunctor (..),
    AsExitcodeBifunctor (..),
  )
where

import Control.Category (id, (.))
import Control.Exitcode.Exitcode (Exitcode, ExitcodeBifunctor (ExitcodeBifunctor))
import Control.Lens (Getter, Lens', Prism', Review, lens, prism', unto)
import Data.Maybe (Maybe (Just))

-- $setup
-- >>> import Prelude
-- >>> import Control.Lens
-- >>> import Control.Exitcode

-- * Exitcode optics

-- | Type class for values that can be viewed as an @Exitcode@.
--
-- >>> view getExitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: Exitcode' () String
-- Exitcode (Identity (Right "abc"))
class GetExitcode s e f a | s -> e f a where
  getExitcode :: Getter s (Exitcode e f a)

-- |
--
-- >>> view getExitcode (mkExitSuccess' "abc" :: Exitcode' () String)
-- Exitcode (Identity (Right "abc"))
instance GetExitcode (Exitcode e f a) e f a where
  getExitcode :: Getter (Exitcode e f a) (Exitcode e f a)
getExitcode = (Exitcode e f a -> f (Exitcode e f a))
-> Exitcode e f a -> f (Exitcode e f a)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE getExitcode #-}

-- |
--
-- >>> view getExitcode (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- Exitcode (Identity (Right "abc"))
instance GetExitcode (ExitcodeBifunctor f e a) e f a where
  getExitcode :: Getter (ExitcodeBifunctor f e a) (Exitcode e f a)
getExitcode = (ExitcodeBifunctor f e a -> Exitcode e f a)
-> (ExitcodeBifunctor f e a
    -> Exitcode e f a -> ExitcodeBifunctor f e a)
-> Lens
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
     (Exitcode e f a)
     (Exitcode e f a)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x) (\ExitcodeBifunctor f e a
_ -> Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor)
  {-# INLINE getExitcode #-}

-- | Type class for values with a lens into an @Exitcode@.
--
-- >>> view exitcode (mkExitSuccess' "abc" :: Exitcode' () String)
-- Exitcode (Identity (Right "abc"))
class (GetExitcode s e f a) => HasExitcode s e f a | s -> e f a where
  exitcode :: Lens' s (Exitcode e f a)

-- |
--
-- >>> view exitcode (mkExitSuccess' "abc" :: Exitcode' () String)
-- Exitcode (Identity (Right "abc"))
instance HasExitcode (Exitcode e f a) e f a where
  exitcode :: Lens' (Exitcode e f a) (Exitcode e f a)
exitcode = (Exitcode e f a -> f (Exitcode e f a))
-> Exitcode e f a -> f (Exitcode e f a)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE exitcode #-}

-- |
--
-- >>> view exitcode (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- Exitcode (Identity (Right "abc"))
-- >>> set exitcode (mkExitFailure1' ()) (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Left ((),NotZero True (Positive 1)))))
instance HasExitcode (ExitcodeBifunctor f e a) e f a where
  exitcode :: Lens' (ExitcodeBifunctor f e a) (Exitcode e f a)
exitcode = (ExitcodeBifunctor f e a -> Exitcode e f a)
-> (ExitcodeBifunctor f e a
    -> Exitcode e f a -> ExitcodeBifunctor f e a)
-> Lens' (ExitcodeBifunctor f e a) (Exitcode e f a)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x) (\ExitcodeBifunctor f e a
_ Exitcode e f a
x -> Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor Exitcode e f a
x)
  {-# INLINE exitcode #-}

-- | Type class for values that can be constructed from an @Exitcode@.
--
-- >>> review reviewExitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: Exitcode' () String
-- Exitcode (Identity (Right "abc"))
class ReviewExitcode t e f a | t -> e f a where
  reviewExitcode :: Review t (Exitcode e f a)

-- |
--
-- >>> review reviewExitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: Exitcode' () String
-- Exitcode (Identity (Right "abc"))
instance ReviewExitcode (Exitcode e f a) e f a where
  reviewExitcode :: Review (Exitcode e f a) (Exitcode e f a)
reviewExitcode = (Exitcode e f a -> Exitcode e f a)
-> Optic
     p
     f
     (Exitcode e f a)
     (Exitcode e f a)
     (Exitcode e f a)
     (Exitcode e f a)
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto Exitcode e f a -> Exitcode e f a
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE reviewExitcode #-}

-- |
--
-- >>> review reviewExitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: ExitcodeBifunctor' () String
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
instance ReviewExitcode (ExitcodeBifunctor f e a) e f a where
  reviewExitcode :: Review (ExitcodeBifunctor f e a) (Exitcode e f a)
reviewExitcode = (Exitcode e f a -> ExitcodeBifunctor f e a)
-> Optic
     p
     f
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
     (Exitcode e f a)
     (Exitcode e f a)
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor
  {-# INLINE reviewExitcode #-}

-- | Type class for values with a prism into an @Exitcode@.
--
-- >>> preview _Exitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: Maybe (Exitcode' () String)
-- Just (Exitcode (Identity (Right "abc")))
class (ReviewExitcode t e f a) => AsExitcode t e f a | t -> e f a where
  _Exitcode :: Prism' t (Exitcode e f a)

-- |
--
-- >>> preview _Exitcode (mkExitSuccess' "abc" :: Exitcode' () String) :: Maybe (Exitcode' () String)
-- Just (Exitcode (Identity (Right "abc")))
instance AsExitcode (Exitcode e f a) e f a where
  _Exitcode :: Prism' (Exitcode e f a) (Exitcode e f a)
_Exitcode = p (Exitcode e f a) (f (Exitcode e f a))
-> p (Exitcode e f a) (f (Exitcode e f a))
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE _Exitcode #-}

-- |
--
-- >>> preview _Exitcode (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String) :: Maybe (Exitcode' () String)
-- Just (Exitcode (Identity (Right "abc")))
instance AsExitcode (ExitcodeBifunctor f e a) e f a where
  _Exitcode :: Prism' (ExitcodeBifunctor f e a) (Exitcode e f a)
_Exitcode = (Exitcode e f a -> ExitcodeBifunctor f e a)
-> (ExitcodeBifunctor f e a -> Maybe (Exitcode e f a))
-> Prism' (ExitcodeBifunctor f e a) (Exitcode e f a)
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor (\(ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a -> Maybe (Exitcode e f a)
forall a. a -> Maybe a
Just Exitcode e f a
x)
  {-# INLINE _Exitcode #-}

-- * ExitcodeBifunctor optics

-- | Type class for values that can be viewed as an @ExitcodeBifunctor@.
--
-- >>> view getExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
class GetExitcodeBifunctor s f e a | s -> f e a where
  getExitcodeBifunctor :: Getter s (ExitcodeBifunctor f e a)

-- |
--
-- >>> view getExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
instance GetExitcodeBifunctor (ExitcodeBifunctor f e a) f e a where
  getExitcodeBifunctor :: Getter (ExitcodeBifunctor f e a) (ExitcodeBifunctor f e a)
getExitcodeBifunctor = (ExitcodeBifunctor f e a -> f (ExitcodeBifunctor f e a))
-> ExitcodeBifunctor f e a -> f (ExitcodeBifunctor f e a)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE getExitcodeBifunctor #-}

-- |
--
-- >>> view getExitcodeBifunctor (mkExitSuccess' "abc" :: Exitcode' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
instance GetExitcodeBifunctor (Exitcode e f a) f e a where
  getExitcodeBifunctor :: Getter (Exitcode e f a) (ExitcodeBifunctor f e a)
getExitcodeBifunctor = (Exitcode e f a -> ExitcodeBifunctor f e a)
-> (Exitcode e f a -> ExitcodeBifunctor f e a -> Exitcode e f a)
-> Lens
     (Exitcode e f a)
     (Exitcode e f a)
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor (\Exitcode e f a
_ (ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x)
  {-# INLINE getExitcodeBifunctor #-}

-- | Type class for values with a lens into an @ExitcodeBifunctor@.
--
-- >>> view exitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
class (GetExitcodeBifunctor s f e a) => HasExitcodeBifunctor s f e a | s -> f e a where
  exitcodeBifunctor :: Lens' s (ExitcodeBifunctor f e a)

-- |
--
-- >>> view exitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
instance HasExitcodeBifunctor (ExitcodeBifunctor f e a) f e a where
  exitcodeBifunctor :: Lens' (ExitcodeBifunctor f e a) (ExitcodeBifunctor f e a)
exitcodeBifunctor = (ExitcodeBifunctor f e a -> f (ExitcodeBifunctor f e a))
-> ExitcodeBifunctor f e a -> f (ExitcodeBifunctor f e a)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE exitcodeBifunctor #-}

-- |
--
-- >>> view exitcodeBifunctor (mkExitSuccess' "abc" :: Exitcode' () String)
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
-- >>> set exitcodeBifunctor (ExitcodeBifunctor (mkExitFailure1' ())) (mkExitSuccess' "abc" :: Exitcode' () String)
-- Exitcode (Identity (Left ((),NotZero True (Positive 1))))
instance HasExitcodeBifunctor (Exitcode e f a) f e a where
  exitcodeBifunctor :: Lens' (Exitcode e f a) (ExitcodeBifunctor f e a)
exitcodeBifunctor = (Exitcode e f a -> ExitcodeBifunctor f e a)
-> (Exitcode e f a -> ExitcodeBifunctor f e a -> Exitcode e f a)
-> Lens' (Exitcode e f a) (ExitcodeBifunctor f e a)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor (\Exitcode e f a
_ (ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x)
  {-# INLINE exitcodeBifunctor #-}

-- | Type class for values that can be constructed from an @ExitcodeBifunctor@.
--
-- >>> review reviewExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String) :: ExitcodeBifunctor' () String
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
class ReviewExitcodeBifunctor t f e a | t -> f e a where
  reviewExitcodeBifunctor :: Review t (ExitcodeBifunctor f e a)

-- |
--
-- >>> review reviewExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String) :: ExitcodeBifunctor' () String
-- ExitcodeBifunctor (Exitcode (Identity (Right "abc")))
instance ReviewExitcodeBifunctor (ExitcodeBifunctor f e a) f e a where
  reviewExitcodeBifunctor :: Review (ExitcodeBifunctor f e a) (ExitcodeBifunctor f e a)
reviewExitcodeBifunctor = (ExitcodeBifunctor f e a -> ExitcodeBifunctor f e a)
-> Optic
     p
     f
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto ExitcodeBifunctor f e a -> ExitcodeBifunctor f e a
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE reviewExitcodeBifunctor #-}

-- |
--
-- >>> review reviewExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String) :: Exitcode' () String
-- Exitcode (Identity (Right "abc"))
instance ReviewExitcodeBifunctor (Exitcode e f a) f e a where
  reviewExitcodeBifunctor :: Review (Exitcode e f a) (ExitcodeBifunctor f e a)
reviewExitcodeBifunctor = (ExitcodeBifunctor f e a -> Exitcode e f a)
-> Optic
     p
     f
     (Exitcode e f a)
     (Exitcode e f a)
     (ExitcodeBifunctor f e a)
     (ExitcodeBifunctor f e a)
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto (\(ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x)
  {-# INLINE reviewExitcodeBifunctor #-}

-- | Type class for values with a prism into an @ExitcodeBifunctor@.
--
-- >>> preview _ExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- Just (ExitcodeBifunctor (Exitcode (Identity (Right "abc"))))
class (ReviewExitcodeBifunctor t f e a) => AsExitcodeBifunctor t f e a | t -> f e a where
  _ExitcodeBifunctor :: Prism' t (ExitcodeBifunctor f e a)

-- |
--
-- >>> preview _ExitcodeBifunctor (ExitcodeBifunctor (mkExitSuccess' "abc") :: ExitcodeBifunctor' () String)
-- Just (ExitcodeBifunctor (Exitcode (Identity (Right "abc"))))
instance AsExitcodeBifunctor (ExitcodeBifunctor f e a) f e a where
  _ExitcodeBifunctor :: Prism' (ExitcodeBifunctor f e a) (ExitcodeBifunctor f e a)
_ExitcodeBifunctor = p (ExitcodeBifunctor f e a) (f (ExitcodeBifunctor f e a))
-> p (ExitcodeBifunctor f e a) (f (ExitcodeBifunctor f e a))
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE _ExitcodeBifunctor #-}

-- |
--
-- >>> preview _ExitcodeBifunctor (mkExitSuccess' "abc" :: Exitcode' () String)
-- Just (ExitcodeBifunctor (Exitcode (Identity (Right "abc"))))
instance AsExitcodeBifunctor (Exitcode e f a) f e a where
  _ExitcodeBifunctor :: Prism' (Exitcode e f a) (ExitcodeBifunctor f e a)
_ExitcodeBifunctor = (ExitcodeBifunctor f e a -> Exitcode e f a)
-> (Exitcode e f a -> Maybe (ExitcodeBifunctor f e a))
-> Prism' (Exitcode e f a) (ExitcodeBifunctor f e a)
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' (\(ExitcodeBifunctor Exitcode e f a
x) -> Exitcode e f a
x) (ExitcodeBifunctor f e a -> Maybe (ExitcodeBifunctor f e a)
forall a. a -> Maybe a
Just (ExitcodeBifunctor f e a -> Maybe (ExitcodeBifunctor f e a))
-> (Exitcode e f a -> ExitcodeBifunctor f e a)
-> Exitcode e f a
-> Maybe (ExitcodeBifunctor f e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Exitcode e f a -> ExitcodeBifunctor f e a
forall (f :: * -> *) e a. Exitcode e f a -> ExitcodeBifunctor f e a
ExitcodeBifunctor)
  {-# INLINE _ExitcodeBifunctor #-}