content: -- | A simple system so that the Cryptol driver can communicate
  -- with users (or not).
  module Cryptol.Utils.Logger
    ( Logger
  
    , stdoutLogger
    , stderrLogger
    , handleLogger
    , quietLogger
    , funLogger
  
    , logPutStr
    , logPutStrLn
    , logPrint
    ) where
  
  import System.IO(Handle, hPutStr, stdout, stderr)
  import Control.DeepSeq(NFData(..))
  
  -- | A logger provides simple abstraction for sending messages.
  newtype Logger = Logger (String -> IO ())
  
  instance NFData Logger where
    rnf (Logger x) = rnf x
  
  -- | Send the given string to the log.
  logPutStr :: Logger -> String -> IO ()
  logPutStr (Logger f) = f
  
  -- | Send the given string with a newline at the end.
  logPutStrLn :: Logger -> String -> IO ()
  logPutStrLn l s = logPutStr l (s ++ "\n")
  
  -- | Send the given value using its 'Show' instance.
  -- Adds a newline at the end.
  logPrint :: Show a => Logger -> a -> IO ()
  logPrint l a = logPutStrLn l (show a)
  
  -- | A logger that ignores all messages.
  quietLogger :: Logger
  quietLogger = Logger (const (return ()))
  
  -- | Log to the given handle.
  handleLogger :: Handle -> Logger
  handleLogger h = Logger (hPutStr h)
  
  -- | Log to stdout.
  stdoutLogger :: Logger
  stdoutLogger = handleLogger stdout
  
  -- | Log to stderr.
  stderrLogger :: Logger
  stderrLogger = handleLogger stderr
  
  -- | Just use this function for logging.
  funLogger :: (String -> IO ()) -> Logger
  funLogger = Logger
  