conduit-extra-1.2.1: Data/Conduit/Process/Typed.hs
{-# LANGUAGE DataKinds #-}
-- | The "System.Process.Typed" module from @typed-process@, but with
-- added conduit helpers.
module Data.Conduit.Process.Typed
( -- * Conduit specific stuff
createSink
, createSource
-- * Generalized functions
, withProcess
, withProcess_
-- * Reexports
, module System.Process.Typed
) where
import System.Process.Typed hiding (withProcess, withProcess_)
import qualified System.Process.Typed as P
import Data.Conduit (ConduitM)
import qualified Data.Conduit as C
import qualified Data.Conduit.Binary as CB
import Control.Monad.IO.Unlift
import qualified Data.ByteString as S
import System.IO (hClose)
-- | Provide input to a process by writing to a conduit.
--
-- @since 1.2.1
createSink :: MonadIO m => StreamSpec 'STInput (ConduitM S.ByteString o m ())
createSink =
(\h -> C.addCleanup (\_ -> liftIO $ hClose h) (CB.sinkHandle h))
`fmap` createPipe
-- | Read output from a process by read from a conduit.
--
-- @since 1.2.1
createSource :: MonadIO m => StreamSpec 'STOutput (ConduitM i S.ByteString m ())
createSource =
(\h -> C.addCleanup (\_ -> liftIO $ hClose h) (CB.sourceHandle h))
`fmap` createPipe
-- | Same as 'P.withProcess', but generalized to 'MonadUnliftIO'.
--
-- @since 1.2.1
withProcess
:: MonadUnliftIO m
=> ProcessConfig stdin stdout stderr
-> (Process stdin stdout stderr -> m a)
-> m a
withProcess pc f = withRunInIO $ \run -> P.withProcess pc (run . f)
-- | Same as 'P.withProcess_', but generalized to 'MonadUnliftIO'.
--
-- @since 1.2.1
withProcess_
:: MonadUnliftIO m
=> ProcessConfig stdin stdout stderr
-> (Process stdin stdout stderr -> m a)
-> m a
withProcess_ pc f = withRunInIO $ \run -> P.withProcess pc (run . f)