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

module Control.Process.StdStream(
  StdStream(..)
, AsStdStream(..)
, HasStdStream(..)
) where

import Control.Category ( Category(id, (.)) )
import Control.Lens ( prism', Lens', Prism' )
import Data.Maybe ( Maybe(Nothing, Just) )
import System.Process ( StdStream(..) )

class AsStdStream a where
  _StdStream ::
    Prism' a StdStream
  _Inherit ::
    Prism' a ()
  _Inherit =
    p StdStream (f StdStream) -> p a (f a)
forall a. AsStdStream a => Prism' a StdStream
_StdStream (p StdStream (f StdStream) -> p a (f a))
-> (p () (f ()) -> p StdStream (f StdStream))
-> p () (f ())
-> 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
. p () (f ()) -> p StdStream (f StdStream)
forall a. AsStdStream a => Prism' a ()
_Inherit
  _CreatePipe ::
    Prism' a ()
  _CreatePipe =
    p StdStream (f StdStream) -> p a (f a)
forall a. AsStdStream a => Prism' a StdStream
_StdStream (p StdStream (f StdStream) -> p a (f a))
-> (p () (f ()) -> p StdStream (f StdStream))
-> p () (f ())
-> 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
. p () (f ()) -> p StdStream (f StdStream)
forall a. AsStdStream a => Prism' a ()
_CreatePipe
  _NoStream ::
    Prism' a ()
  _NoStream =
    p StdStream (f StdStream) -> p a (f a)
forall a. AsStdStream a => Prism' a StdStream
_StdStream (p StdStream (f StdStream) -> p a (f a))
-> (p () (f ()) -> p StdStream (f StdStream))
-> p () (f ())
-> 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
. p () (f ()) -> p StdStream (f StdStream)
forall a. AsStdStream a => Prism' a ()
_NoStream

instance AsStdStream StdStream where
  _StdStream :: p StdStream (f StdStream) -> p StdStream (f StdStream)
_StdStream =
    p StdStream (f StdStream) -> p StdStream (f StdStream)
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  _Inherit :: p () (f ()) -> p StdStream (f StdStream)
_Inherit =
    (() -> StdStream) -> (StdStream -> Maybe ()) -> Prism' StdStream ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> StdStream
Inherit)
      (\case
        StdStream
Inherit -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        StdStream
_ -> Maybe ()
forall a. Maybe a
Nothing
      )
  _CreatePipe :: p () (f ()) -> p StdStream (f StdStream)
_CreatePipe =
    (() -> StdStream) -> (StdStream -> Maybe ()) -> Prism' StdStream ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> StdStream
CreatePipe)
      (\case
        StdStream
CreatePipe -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        StdStream
_ -> Maybe ()
forall a. Maybe a
Nothing
      )
  _NoStream :: p () (f ()) -> p StdStream (f StdStream)
_NoStream =
    (() -> StdStream) -> (StdStream -> Maybe ()) -> Prism' StdStream ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> StdStream
NoStream)
      (\case
        StdStream
NoStream -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        StdStream
_ -> Maybe ()
forall a. Maybe a
Nothing
      )

class HasStdStream a where
  stdStream ::
    Lens' a StdStream

instance HasStdStream StdStream where
  stdStream :: (StdStream -> f StdStream) -> StdStream -> f StdStream
stdStream =
    (StdStream -> f StdStream) -> StdStream -> f StdStream
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id