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

module Control.Process.CmdSpec(
  AsCmdSpec(..)
, HasCmdSpec(..)
) where

import Control.Category ( Category(id, (.)) )
import Control.Lens
    ( Traversable(traverse),
      prism',
      Field1(_1),
      Field2(_2),
      Lens',
      Prism',
      Traversal' )
import Data.Maybe ( Maybe(Nothing, Just) )
import Data.Functor ( Functor(fmap) )
import Data.String ( String )
import Data.Tuple ( uncurry )
import System.FilePath ( FilePath )
import System.Process ( CreateProcess(..), CmdSpec(..) )

class AsCmdSpec a where
  _CmdSpec ::
    Prism' a CmdSpec
  _ShellCommand ::
    Prism' a String
  _ShellCommand =
    p CmdSpec (f CmdSpec) -> p a (f a)
forall a. AsCmdSpec a => Prism' a CmdSpec
_CmdSpec (p CmdSpec (f CmdSpec) -> p a (f a))
-> (p String (f String) -> p CmdSpec (f CmdSpec))
-> p String (f String)
-> 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 String (f String) -> p CmdSpec (f CmdSpec)
forall a. AsCmdSpec a => Prism' a String
_ShellCommand
  _RawCommand ::
    Prism' a (FilePath, [String])
  _RawCommand =
    p CmdSpec (f CmdSpec) -> p a (f a)
forall a. AsCmdSpec a => Prism' a CmdSpec
_CmdSpec (p CmdSpec (f CmdSpec) -> p a (f a))
-> (p (String, [String]) (f (String, [String]))
    -> p CmdSpec (f CmdSpec))
-> p (String, [String]) (f (String, [String]))
-> 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 (String, [String]) (f (String, [String]))
-> p CmdSpec (f CmdSpec)
forall a. AsCmdSpec a => Prism' a (String, [String])
_RawCommand
  _RawCommandExe ::
    Traversal' a FilePath
  _RawCommandExe =
    ((String, [String]) -> f (String, [String])) -> a -> f a
forall a. AsCmdSpec a => Prism' a (String, [String])
_RawCommand (((String, [String]) -> f (String, [String])) -> a -> f a)
-> ((String -> f String)
    -> (String, [String]) -> f (String, [String]))
-> (String -> f String)
-> 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
. (String -> f String) -> (String, [String]) -> f (String, [String])
forall s t a b. Field1 s t a b => Lens s t a b
_1
  _RawCommandArgumentList ::
    Traversal' a [String]
  _RawCommandArgumentList =
    ((String, [String]) -> f (String, [String])) -> a -> f a
forall a. AsCmdSpec a => Prism' a (String, [String])
_RawCommand (((String, [String]) -> f (String, [String])) -> a -> f a)
-> (([String] -> f [String])
    -> (String, [String]) -> f (String, [String]))
-> ([String] -> f [String])
-> 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
. ([String] -> f [String])
-> (String, [String]) -> f (String, [String])
forall s t a b. Field2 s t a b => Lens s t a b
_2
  _RawCommandArguments ::
    Traversal' a String
  _RawCommandArguments =
    ([String] -> f [String]) -> a -> f a
forall a. AsCmdSpec a => Traversal' a [String]
_RawCommandArgumentList (([String] -> f [String]) -> a -> f a)
-> ((String -> f String) -> [String] -> f [String])
-> (String -> f String)
-> 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
. (String -> f String) -> [String] -> f [String]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse

instance AsCmdSpec CmdSpec where
  _CmdSpec :: p CmdSpec (f CmdSpec) -> p CmdSpec (f CmdSpec)
_CmdSpec = p CmdSpec (f CmdSpec) -> p CmdSpec (f CmdSpec)
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  _ShellCommand :: p String (f String) -> p CmdSpec (f CmdSpec)
_ShellCommand =
    (String -> CmdSpec)
-> (CmdSpec -> Maybe String) -> Prism' CmdSpec String
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      String -> CmdSpec
ShellCommand
      (\case
        ShellCommand String
a -> String -> Maybe String
forall a. a -> Maybe a
Just String
a
        CmdSpec
_ -> Maybe String
forall a. Maybe a
Nothing
      )
  _RawCommand :: p (String, [String]) (f (String, [String]))
-> p CmdSpec (f CmdSpec)
_RawCommand =
    ((String, [String]) -> CmdSpec)
-> (CmdSpec -> Maybe (String, [String]))
-> Prism' CmdSpec (String, [String])
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      ((String -> [String] -> CmdSpec) -> (String, [String]) -> CmdSpec
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> [String] -> CmdSpec
RawCommand)
      (\case
        RawCommand String
a [String]
b -> (String, [String]) -> Maybe (String, [String])
forall a. a -> Maybe a
Just (String
a, [String]
b)
        CmdSpec
_ -> Maybe (String, [String])
forall a. Maybe a
Nothing
      )

class HasCmdSpec a where
  cmdSpec ::
    Lens' a CmdSpec
  shellCommand ::
    Traversal' a String
  shellCommand =
    (CmdSpec -> f CmdSpec) -> a -> f a
forall a. HasCmdSpec a => Lens' a CmdSpec
cmdSpec ((CmdSpec -> f CmdSpec) -> a -> f a)
-> ((String -> f String) -> CmdSpec -> f CmdSpec)
-> (String -> f String)
-> 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
. (String -> f String) -> CmdSpec -> f CmdSpec
forall a. AsCmdSpec a => Prism' a String
_ShellCommand
  rawCommand ::
    Traversal' a (FilePath, [String])
  rawCommand =
    (CmdSpec -> f CmdSpec) -> a -> f a
forall a. HasCmdSpec a => Lens' a CmdSpec
cmdSpec ((CmdSpec -> f CmdSpec) -> a -> f a)
-> (((String, [String]) -> f (String, [String]))
    -> CmdSpec -> f CmdSpec)
-> ((String, [String]) -> f (String, [String]))
-> 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
. ((String, [String]) -> f (String, [String]))
-> CmdSpec -> f CmdSpec
forall a. AsCmdSpec a => Prism' a (String, [String])
_RawCommand
  rawCommandExe ::
    Traversal' a FilePath
  rawCommandExe =
    ((String, [String]) -> f (String, [String])) -> a -> f a
forall a. HasCmdSpec a => Traversal' a (String, [String])
rawCommand (((String, [String]) -> f (String, [String])) -> a -> f a)
-> ((String -> f String)
    -> (String, [String]) -> f (String, [String]))
-> (String -> f String)
-> 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
. (String -> f String) -> (String, [String]) -> f (String, [String])
forall s t a b. Field1 s t a b => Lens s t a b
_1
  rawCommandArgumentList ::
    Traversal' a [String]
  rawCommandArgumentList =
    ((String, [String]) -> f (String, [String])) -> a -> f a
forall a. HasCmdSpec a => Traversal' a (String, [String])
rawCommand (((String, [String]) -> f (String, [String])) -> a -> f a)
-> (([String] -> f [String])
    -> (String, [String]) -> f (String, [String]))
-> ([String] -> f [String])
-> 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
. ([String] -> f [String])
-> (String, [String]) -> f (String, [String])
forall s t a b. Field2 s t a b => Lens s t a b
_2
  rawCommandArguments ::
    Traversal' a String
  rawCommandArguments =
    ([String] -> f [String]) -> a -> f a
forall a. HasCmdSpec a => Traversal' a [String]
rawCommandArgumentList (([String] -> f [String]) -> a -> f a)
-> ((String -> f String) -> [String] -> f [String])
-> (String -> f String)
-> 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
. (String -> f String) -> [String] -> f [String]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse

instance HasCmdSpec CmdSpec where
  cmdSpec :: (CmdSpec -> f CmdSpec) -> CmdSpec -> f CmdSpec
cmdSpec =
    (CmdSpec -> f CmdSpec) -> CmdSpec -> f CmdSpec
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

instance HasCmdSpec CreateProcess where
  cmdSpec :: (CmdSpec -> f CmdSpec) -> CreateProcess -> f CreateProcess
cmdSpec CmdSpec -> f CmdSpec
f (CreateProcess CmdSpec
csc Maybe String
cw Maybe [(String, String)]
en StdStream
sti StdStream
sto StdStream
ste Bool
clf Bool
crg Bool
dct Bool
dcl Bool
cnc Bool
nss Maybe GroupID
chg Maybe UserID
chu Bool
upj) =
    (CmdSpec -> CreateProcess) -> f CmdSpec -> f CreateProcess
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\CmdSpec
csc' -> CmdSpec
-> Maybe String
-> Maybe [(String, String)]
-> StdStream
-> StdStream
-> StdStream
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe GroupID
-> Maybe UserID
-> Bool
-> CreateProcess
CreateProcess CmdSpec
csc' Maybe String
cw Maybe [(String, String)]
en StdStream
sti StdStream
sto StdStream
ste Bool
clf Bool
crg Bool
dct Bool
dcl Bool
cnc Bool
nss Maybe GroupID
chg Maybe UserID
chu Bool
upj) (CmdSpec -> f CmdSpec
f CmdSpec
csc)