content: -- | Re-exports of base functionality. Note that this module is just
  -- used inside the compiler. It's not compiled to JavaScript.
  -- Based on the base-extended package (c) 2013 Simon Meier, licensed as BSD3.
  {-# LANGUAGE NoImplicitPrelude #-}
  module Fay.Compiler.Prelude
    ( module Prelude.Compat -- Partial
  
    -- * Control modules
    , module Control.Applicative
    , module Control.Arrow -- Partial
    , module Control.Monad.Compat
  
    -- * Data modules
    , module Data.Char -- Partial
    , module Data.Data -- Partial
    , module Data.Either
    , module Data.Function
    , module Data.List.Compat -- Partial
    , module Data.Maybe
    , module Data.Monoid -- Partial
    , module Data.Ord
    , module Data.Traversable
  
    -- * Safe
    , module Safe
  
    -- * Additions
    , anyM
    , io
    , readAllFromProcess
    ) where
  
  import           Control.Applicative
  import           Control.Arrow        (first, second, (&&&), (***), (+++), (|||))
  import           Control.Monad.Compat hiding (guard)
  import           Data.Char            hiding (GeneralCategory (..))
  import           Data.Data            (Data (..), Typeable)
  import           Data.Either
  import           Data.Function        (on)
  import           Data.List.Compat
  import           Data.Maybe
  import           Data.Monoid          (Monoid (..))
  import           Data.Ord
  import           Data.Traversable
  import           Prelude.Compat       hiding (exp, mod)
  import           Safe
  
  import           Control.Monad.Except hiding (filterM)
  import           System.Exit
  import           System.Process
  
  -- | Alias of liftIO, I hate typing it. Hate reading it.
  io :: MonadIO m => IO a -> m a
  io = liftIO
  
  -- | Do any of the (monadic) predicates match?
  anyM :: (Functor m, Applicative m, Monad m) => (a -> m Bool) -> [a] -> m Bool
  anyM p l = not . null <$> filterM p l
  
  -- | Read from a process returning both std err and out.
  readAllFromProcess :: FilePath -> [String] -> String -> IO (Either (String,String) (String,String))
  readAllFromProcess program flags input = do
    (code,out,err) <- readProcessWithExitCode program flags input
    return $ case code of
      ExitFailure 127 -> Left ("cannot find executable " ++ program, "")
      ExitFailure _   -> Left (err, out)
      ExitSuccess     -> Right (err, out)
  