packages feed

bishbosh-0.1.1.0: src-exe/Duel/Process/Handles.hs

{-
	Copyright (C) 2021 Dr. Alistair Ward

	This file is part of BishBosh.

	BishBosh is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	BishBosh is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@]	Wraps "System.Process".
-}

module Duel.Process.Handles(
-- * Types
-- ** Data-types
	Handles(
--		MkHandles,
--		getStdIn,
--		getStdOut,
		getStdErr
--		getPId
	),
-- * Functions
	cleanupHandles,
	showHandles,
-- ** Accessors
	getHandlePair,
-- ** Constructor
	mkHandles
) where

import qualified	System.IO
import qualified	System.Process

-- | A container for the IO-handles & process-id of a child process.
data Handles	= MkHandles {
	getStdIn	:: System.IO.Handle,
	getStdOut	:: System.IO.Handle,
	getStdErr	:: System.IO.Handle,
	getPId		:: System.Process.ProcessHandle
}

-- | Constructor.
mkHandles :: String -> [String] -> IO Handles
mkHandles command args	= do
	(stdIn, stdOut, stdErr, pId)	<- System.Process.runInteractiveProcess command args Nothing Nothing

	sequence_ $ [
		(`System.IO.hSetBuffering` System.IO.LineBuffering),
		(`System.IO.hSetEncoding` System.IO.latin1)
	 ] <*> [stdIn, stdOut]

	return {- to IO-monad -} MkHandles {
		getStdIn	= stdIn,
		getStdOut	= stdOut,
		getStdErr	= stdErr,
		getPId		= pId
	}

-- | Accessor.
getHandlePair :: Handles -> (System.IO.Handle, System.IO.Handle)
getHandlePair MkHandles {
	getStdIn	= stdIn,
	getStdOut	= stdOut
} = (stdIn, stdOut)

-- | Show the configuration of the IO-handles.
showHandles :: Handles -> IO [String]
showHandles MkHandles {
	getStdIn	= stdIn,
	getStdOut	= stdOut,
	getStdErr	= stdErr
} = mapM System.IO.hShow [stdIn, stdOut, stdErr]

-- | Terminates the child-process & closes any IO-handles.
cleanupHandles :: Handles -> IO ()
cleanupHandles MkHandles {
	getStdIn	= stdIn,
	getStdOut	= stdOut,
	getStdErr	= stdErr,
	getPId		= pId
} = System.Process.cleanupProcess (Just stdIn, Just stdOut, Just stdErr, pId)