module Sys.Process(
  module CmdSpec
, module CreateProcess
, module StdStream
-- * Running sub-processes
, createProcess
, createProcess_
, shell
, proc
-- ** Simpler functions for common tasks
, Process.callProcess
, Process.callCommand
, Process.spawnProcess
, Process.spawnCommand
, readCreateProcess
, Process.readProcess
, readCreateProcessWithExitCode
, readProcessWithExitCode
-- ** Related utilities
, Process.showCommandForUser
-- ** Control-C handling on Unix
-- $ctlc-handling
-- * Process completion
, waitForProcess
, getProcessExitCode
, Process.terminateProcess
, Process.interruptProcessGroupOf
-- * Interprocess communication
, Process.createPipe
) where

{-
    
    -- ** Related utilities
    showCommandForUser,

    -- ** Control-C handling on Unix
    -- $ctlc-handling

    -- * Process completion
    waitForProcess,
    getProcessExitCode,
    terminateProcess,
    interruptProcessGroupOf,

    -- Interprocess communication
-}

import Control.Category(Category((.)))
import Control.Lens((#), (%~), (^.), _1)
import Data.Functor(Functor(fmap))
import Data.Maybe(Maybe)
import Data.String(String)
import Sys.CmdSpec as CmdSpec
import Sys.CreateProcess as CreateProcess
import Sys.StdStream as StdStream
import Sys.ExitCode(ExitCode, unExitCode)
import System.FilePath(FilePath)
import System.IO(Handle, IO)
import qualified System.Process as Process
import Prelude()

createProcess ::
  CreateProcess
  -> IO (Maybe Handle, Maybe Handle, Maybe Handle, Process.ProcessHandle) 
createProcess =
  Process.createProcess . (_CreateProcess #)

createProcess_ ::
  String
  -> CreateProcess
  -> IO (Maybe Handle, Maybe Handle, Maybe Handle, Process.ProcessHandle) 
createProcess_ s =
  Process.createProcess_ s . (_CreateProcess #)

shell ::
  String
  -> CreateProcess
shell s =
  Process.shell s ^. _CreateProcess

proc ::
  FilePath
  -> [String]
  -> CreateProcess
proc p s =
  Process.proc p s ^. _CreateProcess

readCreateProcess ::
  CreateProcess   
  -> String 
  -> IO String  
readCreateProcess =
  Process.readCreateProcess . (_CreateProcess #)

readCreateProcessWithExitCode ::
  CreateProcess   
  -> String 
  -> IO (ExitCode, String, String)
readCreateProcessWithExitCode p =
  fmap (_1 %~ unExitCode) . Process.readCreateProcessWithExitCode (_CreateProcess # p)

readProcessWithExitCode ::
  FilePath
  -> [String] 
  -> String 
  -> IO (ExitCode, String, String)  
readProcessWithExitCode f a =
  fmap (_1 %~ unExitCode) . Process.readProcessWithExitCode f a

waitForProcess ::
  Process.ProcessHandle
  -> IO ExitCode
waitForProcess =
  fmap unExitCode . Process.waitForProcess

getProcessExitCode ::
  Process.ProcessHandle
  -> IO (Maybe ExitCode) 
getProcessExitCode =
  fmap (fmap unExitCode) . Process.getProcessExitCode