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

module Control.Process.UserID(
  HasUserID(..)
, AsUserID(..)
) where

import Control.Category((.), id)
import Control.Lens ( iso, Lens', Prism' )
import Data.Word ( Word32 )
import System.Posix.Types ( CUid(CUid) )
import System.Process.Internals ( UserID )

class HasUserID a where
  userID ::
    Lens' a UserID
  userIDWord32 ::
    Lens' a Word32
  userIDWord32 =
    (UserID -> f UserID) -> a -> f a
forall a. HasUserID a => Lens' a UserID
userID ((UserID -> f UserID) -> a -> f a)
-> ((Word32 -> f Word32) -> UserID -> f UserID)
-> (Word32 -> f Word32)
-> 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
.
      (UserID -> Word32)
-> (Word32 -> UserID) -> Iso UserID UserID Word32 Word32
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
        (\(CUid Word32
x) -> Word32
x)
        Word32 -> UserID
CUid

instance HasUserID UserID where
  userID :: (UserID -> f UserID) -> UserID -> f UserID
userID =
    (UserID -> f UserID) -> UserID -> f UserID
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

class AsUserID a where
  _UserID ::
    Prism' a UserID
  _UserIDWord32 ::
    Prism' a Word32
  _UserIDWord32 =
    p UserID (f UserID) -> p a (f a)
forall a. AsUserID a => Prism' a UserID
_UserID (p UserID (f UserID) -> p a (f a))
-> (p Word32 (f Word32) -> p UserID (f UserID))
-> p Word32 (f Word32)
-> 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
.
      (UserID -> Word32)
-> (Word32 -> UserID) -> Iso UserID UserID Word32 Word32
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
        (\(CUid Word32
x) -> Word32
x)
        Word32 -> UserID
CUid

instance AsUserID UserID where
  _UserID :: p UserID (f UserID) -> p UserID (f UserID)
_UserID =
    p UserID (f UserID) -> p UserID (f UserID)
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id