-- | Functions in this module check for the presence of various build tools.
module Development.Shake.Check ( checkExecutable
                               -- * Helper functions for specific programs
                               , pandoc
                               , autoconf
                               , automake
                               , cmake
                               , libtool
                               , m4
                               , patsFilter
                               , ghc
                               , compleat
                               , cabal
                               , madlang
                               ) where

import           Control.Monad.IO.Class
import           Data.Maybe             (isJust)
import           System.Directory       (findExecutable)

-- | Check for the presence of some executable.
checkExecutable :: (MonadIO m) => String -> m Bool
checkExecutable = fmap isJust . liftIO . findExecutable

compleat :: MonadIO m => m Bool
compleat = checkExecutable "compleat"

cabal :: MonadIO m => m Bool
cabal = checkExecutable "cabal"

autoconf :: MonadIO m => m Bool
autoconf = checkExecutable "autoconf"

ghc :: MonadIO m => m Bool
ghc = checkExecutable "ghc"

pandoc :: MonadIO m => m Bool
pandoc = checkExecutable "pandoc"

-- | @since 3.1.1.0
cmake :: MonadIO m => m Bool
cmake = checkExecutable "cmake"

-- | @since 3.1.1.0
automake :: MonadIO m => m Bool
automake = checkExecutable "automake"

-- | @since 3.1.1.0
libtool :: MonadIO m => m Bool
libtool = checkExecutable "libtool"

-- | @since 3.1.1.0
m4 :: MonadIO m => m Bool
m4 = checkExecutable "m4"

madlang :: MonadIO m => m Bool
madlang = checkExecutable "madlang"

-- | Check for presence of @pats-filter@.
patsFilter :: MonadIO m => m Bool
patsFilter = checkExecutable "pats-filter"