content: {-# LANGUAGE NoMonomorphismRestriction #-}
  
  -- | Shell scripting with Conduit
  --
  -- This module consists only of re-exports, including a few thousand
  -- top-level names based on @PATH@. If you don't want that, you can
  -- cherry-pick specific modules to import from the library.
  --
  -- See "Data.Conduit.Shell.PATH" for all binaries. But you should be
  -- able to use whatever executables are in your @PATH@ when the library
  -- is compiled.
  --
  -- == Examples
  --
  -- The monad instance of Conduit will simply pass along all stdout
  -- results:
  --
  -- Piping with Conduit's normal pipe will predictably pipe things
  -- together, as in Bash:
  --
  -- >>> run (do shell "echo Hello" $| sed "s/l/a/"; echo "OK!")
  -- Healo
  -- OK!
  --
  -- Streaming pipes (aka lazy pipes) is also possible:
  --
  -- >>> run (tail' "/tmp/foo.txt" "-f" $| grep "--line-buffered" "Hello")
  -- Hello, world!
  -- Oh, hello!
  --
  -- (Remember that @grep@ needs @--line-buffered@ if it is to output
  -- things line-by-line).
  --
  -- Run custom processes via the @proc@ function:
  --
  -- >>> run (proc "ls" [])
  -- dist  LICENSE  README.md  Setup.hs  shell-conduit.cabal  src  TAGS  TODO.org
  --
  -- Run shell commands via the @shell@ function:
  --
  -- >>> run (shell "ls")
  -- dist  LICENSE  README.md  Setup.hs  shell-conduit.cabal  src  TAGS  TODO.org
  --
  -- Run conduits via the @conduit@ function:
  --
  -- >>> run (cat "/tmp/foo.txt" $| conduit (do Just x <- await; yield x))
  -- Hello!
  --
  -- == How it works
  --
  -- All executable names in the @PATH@ at compile-time are brought into
  -- scope as runnable process conduits e.g. @ls@ or @grep@.
  --
  --
  -- All processes are bound as variadic process calling functions, like this:
  --
  -- @
  -- rmdir :: ProcessType r => r
  -- ls :: ProcessType r => r
  -- @
  --
  -- But ultimately the types end up being:
  --
  -- @
  -- rmdir "foo" :: Segment ()
  -- ls :: Segment ()
  -- ls "." :: Segment ()
  -- @
  --
  -- Etc.
  --
  -- Run all shell scripts with 'run':
  --
  -- @
  -- run :: Segment r -> IO r
  -- @
  --
  -- == String types
  --
  -- If using @OverloadedStrings@ so that you can use 'Text' for arguments,
  -- then also enable @ExtendedDefaultRules@, otherwise you'll get
  -- ambiguous type errors.
  --
  -- @
  -- {-# LANGUAGE ExtendedDefaultRules #-}
  -- @
  --
  -- But this isn't necessary if you don't need to use 'Text' yet. Strings
  -- literals will be interpreted as 'String'. Though you can pass a value
  -- of type 'Text' or any instance of 'CmdArg' without needing conversions.
  --
  
  module Data.Conduit.Shell
    (-- * Running scripts
     run
     -- * Making segments
    ,shell
    ,proc
    ,conduit
    ,text
    ,bytes
    -- * Composition of segments
    ,($|)
    ,Segment
    ,ProcessException(..)
    -- * Re-exports
    -- $exports
    ,module Data.Conduit.Shell.PATH
    ,module Data.Conduit.Shell.Types
    ,module Data.Conduit.Shell.Variadic
    ,module Data.Conduit)
    where
  
  import Data.Conduit
  import Data.Conduit.Shell.PATH hiding (strings)
  import Data.Conduit.Shell.Process
  import Data.Conduit.Shell.Types
  import Data.Conduit.Shell.Variadic
  
  -- $exports
  --
  -- The following modules are exported for scripting
  -- convenience. "Data.Conduit" and "Data.Conduit.Filesystem" are
  -- re-exported from other libraries because they are typical uses. If
  -- you want a stream of the contents of a directory, recursively,
  -- 'sourceDirectoryDeep' is handy. A program like @find@ is strict,
  -- whereas a Conduit can stop processing whenever you wish.
  --
  -- You might want to import the regular Conduit modules qualified, too:
  --
  -- @
  -- import qualified Data.Conduit.List as CL
  -- @
  --
  -- Which contains handy functions for working on streams in a
  -- list-like way. See the rest of the handy modules for Conduit in
  -- conduit-extra: <http://hackage.haskell.org/package/conduit-extra>
  --
  -- Also of interest is csv-conduit: <http://hackage.haskell.org/package/csv-conduit>
  -- And html-conduit: <http://hackage.haskell.org/package/html-conduit>
  -- And http-conduit: <http://hackage.haskell.org/package/http-conduit>
  --
  -- Finally, see the Conduit category on Hackage for other useful libraries: <http://hackage.haskell.org/packages/#cat:Conduit>
  --
  -- All of these general purpose Conduits can be used in shell
  -- scripting.
  