packages feed

exitcode-0.1.0.6: src/Control/Process/CmdSpec.hs

{-# 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 =
    _CmdSpec . _ShellCommand
  _RawCommand ::
    Prism' a (FilePath, [String])
  _RawCommand =
    _CmdSpec . _RawCommand
  _RawCommandExe ::
    Traversal' a FilePath
  _RawCommandExe =
    _RawCommand . _1
  _RawCommandArgumentList ::
    Traversal' a [String]
  _RawCommandArgumentList =
    _RawCommand . _2
  _RawCommandArguments ::
    Traversal' a String
  _RawCommandArguments =
    _RawCommandArgumentList . traverse

instance AsCmdSpec CmdSpec where
  _CmdSpec = id
  _ShellCommand =
    prism'
      ShellCommand
      (\case
        ShellCommand a -> Just a
        _ -> Nothing
      )
  _RawCommand =
    prism'
      (uncurry RawCommand)
      (\case
        RawCommand a b -> Just (a, b)
        _ -> Nothing
      )

class HasCmdSpec a where
  cmdSpec ::
    Lens' a CmdSpec
  shellCommand ::
    Traversal' a String
  shellCommand =
    cmdSpec . _ShellCommand
  rawCommand ::
    Traversal' a (FilePath, [String])
  rawCommand =
    cmdSpec . _RawCommand
  rawCommandExe ::
    Traversal' a FilePath
  rawCommandExe =
    rawCommand . _1
  rawCommandArgumentList ::
    Traversal' a [String]
  rawCommandArgumentList =
    rawCommand . _2
  rawCommandArguments ::
    Traversal' a String
  rawCommandArguments =
    rawCommandArgumentList . traverse

instance HasCmdSpec CmdSpec where
  cmdSpec =
    id

instance HasCmdSpec CreateProcess where
  cmdSpec f (CreateProcess csc cw en sti sto ste clf crg dct dcl cnc nss chg chu upj) =
    fmap (\csc' -> CreateProcess csc' cw en sti sto ste clf crg dct dcl cnc nss chg chu upj) (f csc)