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

module Control.Process.FD(
  HasFD(..)
, AsFD(..)
) where

import Control.Category((.), id)
import Control.Lens ( iso, Lens', Prism' )
import Data.Int ( Int32 )
import Foreign.C.Types ( CInt(CInt) )
import System.Posix.Internals ( FD )

class HasFD a where
  fd ::
    Lens' a FD
  fdInt32 ::
    Lens' a Int32
  fdInt32 =
    (FD -> f FD) -> a -> f a
forall a. HasFD a => Lens' a FD
fd ((FD -> f FD) -> a -> f a)
-> ((Int32 -> f Int32) -> FD -> f FD)
-> (Int32 -> f Int32)
-> a
-> f a
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
      (FD -> Int32) -> (Int32 -> FD) -> Iso FD FD Int32 Int32
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
        (\(CInt Int32
x) -> Int32
x)
        Int32 -> FD
CInt

instance HasFD FD where
  fd :: (FD -> f FD) -> FD -> f FD
fd =
    (FD -> f FD) -> FD -> f FD
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

class AsFD a where
  _FD ::
    Prism' a FD
  _FDInt32 ::
    Prism' a Int32
  _FDInt32 =
    p FD (f FD) -> p a (f a)
forall a. AsFD a => Prism' a FD
_FD (p FD (f FD) -> p a (f a))
-> (p Int32 (f Int32) -> p FD (f FD))
-> p Int32 (f Int32)
-> p a (f a)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
      (FD -> Int32) -> (Int32 -> FD) -> Iso FD FD Int32 Int32
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
        (\(CInt Int32
x) -> Int32
x)
        Int32 -> FD
CInt

instance AsFD FD where
  _FD :: p FD (f FD) -> p FD (f FD)
_FD =
    p FD (f FD) -> p FD (f FD)
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id