{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wall #-}
module Control.Process.Handle
( Handle,
GetHandle (..),
HasHandle (..),
ReviewHandle (..),
AsHandle (..),
)
where
import Control.Category (id)
import Control.Lens (Getter, Lens', Prism', Review, prism', unto)
import Data.Maybe (Maybe (Just, Nothing))
import System.IO (Handle)
import System.Process (StdStream (UseHandle))
class GetHandle a where
getHandle ::
Getter a Handle
instance GetHandle Handle where
getHandle :: Getter Handle Handle
getHandle = (Handle -> f Handle) -> Handle -> f Handle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
{-# INLINE getHandle #-}
class (GetHandle a) => HasHandle a where
handle ::
Lens' a Handle
instance HasHandle Handle where
handle :: Lens' Handle Handle
handle =
(Handle -> f Handle) -> Handle -> f Handle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
class ReviewHandle a where
reviewHandle ::
Review a Handle
instance ReviewHandle Handle where
reviewHandle :: Review Handle Handle
reviewHandle = (Handle -> Handle) -> Optic p f Handle Handle Handle Handle
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto Handle -> Handle
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
{-# INLINE reviewHandle #-}
instance ReviewHandle StdStream where
reviewHandle :: Review StdStream Handle
reviewHandle = (Handle -> StdStream)
-> Optic p f StdStream StdStream Handle Handle
forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Profunctor p, Bifunctor p, Functor f) =>
(b -> t) -> Optic p f s t a b
unto Handle -> StdStream
UseHandle
{-# INLINE reviewHandle #-}
class (ReviewHandle a) => AsHandle a where
_Handle ::
Prism' a Handle
instance AsHandle Handle where
_Handle :: Prism' Handle Handle
_Handle =
p Handle (f Handle) -> p Handle (f Handle)
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
instance AsHandle StdStream where
_Handle :: Prism' StdStream Handle
_Handle =
(Handle -> StdStream)
-> (StdStream -> Maybe Handle) -> Prism' StdStream Handle
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
Handle -> StdStream
UseHandle
( \case
UseHandle Handle
a -> Handle -> Maybe Handle
forall a. a -> Maybe a
Just Handle
a
StdStream
_ -> Maybe Handle
forall a. Maybe a
Nothing
)