{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wall #-}

module Control.Process.ProcessHandle
  ( ProcessHandle,
    GetProcessHandle (..),
    HasProcessHandle (..),
    ReviewProcessHandle (..),
    AsProcessHandle (..),
  )
where

import Control.Category (id)
import Control.Lens (Getter, Lens', Prism', Review, unto)
import System.Process (ProcessHandle)

-- | Type class for values that can be viewed as a @ProcessHandle@.
class GetProcessHandle a where
  getProcessHandle ::
    Getter a ProcessHandle

instance GetProcessHandle ProcessHandle where
  getProcessHandle :: Getter ProcessHandle ProcessHandle
getProcessHandle = (ProcessHandle -> f ProcessHandle)
-> ProcessHandle -> f ProcessHandle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE getProcessHandle #-}

-- | Type class for values with a lens into a @ProcessHandle@.
class (GetProcessHandle a) => HasProcessHandle a where
  processHandle ::
    Lens' a ProcessHandle

instance HasProcessHandle ProcessHandle where
  processHandle :: Lens' ProcessHandle ProcessHandle
processHandle =
    (ProcessHandle -> f ProcessHandle)
-> ProcessHandle -> f ProcessHandle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

-- | Type class for values that can be constructed from a @ProcessHandle@.
class ReviewProcessHandle a where
  reviewProcessHandle ::
    Review a ProcessHandle

instance ReviewProcessHandle ProcessHandle where
  reviewProcessHandle :: Review ProcessHandle ProcessHandle
reviewProcessHandle = (ProcessHandle -> ProcessHandle)
-> Optic
     p f ProcessHandle ProcessHandle ProcessHandle ProcessHandle
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto ProcessHandle -> ProcessHandle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  {-# INLINE reviewProcessHandle #-}

-- | Type class for values with a prism into a @ProcessHandle@.
class (ReviewProcessHandle a) => AsProcessHandle a where
  _ProcessHandle ::
    Prism' a ProcessHandle

instance AsProcessHandle ProcessHandle where
  _ProcessHandle :: Prism' ProcessHandle ProcessHandle
_ProcessHandle =
    p ProcessHandle (f ProcessHandle)
-> p ProcessHandle (f ProcessHandle)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id