packages feed

exitcode-0.3.0.0: src/Control/Process/Pid.hs

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

module Control.Process.Pid
  ( Pid,
    GetPid (..),
    HasPid (..),
    ReviewPid (..),
    AsPid (..),
  )
where

import Control.Category (id, (.))
import Control.Lens (Getter, Lens', Prism', Review, iso, unto)
import Data.Int (Int32)
import System.Posix.Types (CPid (CPid))
import System.Process (Pid)

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

-- | Type class for values that can be viewed as a @Pid@.
--
-- >>> view viewPid (CPid 42)
-- 42
class GetPid a where
  viewPid ::
    Getter a Pid
  {-# INLINE viewPidInt32 #-}
  viewPidInt32 ::
    Getter a Int32
  viewPidInt32 =
    viewPid
      . iso
        (\(CPid x) -> x)
        CPid

-- |
--
-- >>> view viewPid (CPid 42)
-- 42
-- >>> view viewPidInt32 (CPid 42)
-- 42
instance GetPid Pid where
  viewPid = id
  {-# INLINE viewPid #-}

-- | Type class for values with a lens into a @Pid@.
--
-- >>> view pid (CPid 42)
-- 42
class (GetPid a) => HasPid a where
  pid ::
    Lens' a Pid
  {-# INLINE pidInt32 #-}
  pidInt32 ::
    Lens' a Int32
  pidInt32 =
    pid
      . iso
        (\(CPid x) -> x)
        CPid

-- |
--
-- >>> view pid (CPid 42)
-- 42
-- >>> view pidInt32 (CPid 42)
-- 42
-- >>> set pidInt32 99 (CPid 42)
-- 99
instance HasPid Pid where
  pid =
    id

-- | Type class for values that can be constructed from a @Pid@.
--
-- >>> review reviewPid (CPid 42) :: Pid
-- 42
class ReviewPid a where
  reviewPid ::
    Review a Pid
  {-# INLINE reviewPidInt32 #-}
  reviewPidInt32 ::
    Review a Int32
  reviewPidInt32 =
    reviewPid
      . iso
        (\(CPid x) -> x)
        CPid

-- |
--
-- >>> review reviewPid (CPid 42) :: Pid
-- 42
-- >>> review reviewPidInt32 99 :: Pid
-- 99
instance ReviewPid Pid where
  reviewPid = unto id
  {-# INLINE reviewPid #-}

-- | Type class for values with a prism into a @Pid@.
--
-- >>> preview _Pid (CPid 42)
-- Just 42
class (ReviewPid a) => AsPid a where
  _Pid ::
    Prism' a Pid
  {-# INLINE _PidInt32 #-}
  _PidInt32 ::
    Prism' a Int32
  _PidInt32 =
    _Pid
      . iso
        (\(CPid x) -> x)
        CPid

-- |
--
-- >>> preview _Pid (CPid 42)
-- Just 42
-- >>> preview _PidInt32 (CPid 42)
-- Just 42
-- >>> review _PidInt32 99 :: Pid
-- 99
instance AsPid Pid where
  _Pid =
    id