content: {-# LANGUAGE RecordWildCards #-}
  
  module System.Log.FastLogger.Write (
      writeLogStr,
      writeBigLogStr,
      Loggers (..),
  ) where
  
  import Foreign.Marshal.Alloc (allocaBytes)
  import Foreign.Ptr (plusPtr)
  
  import System.Log.FastLogger.FileIO
  import System.Log.FastLogger.IO
  import System.Log.FastLogger.Imports
  import System.Log.FastLogger.LogStr
  
  ----------------------------------------------------------------
  
  -- | Writting 'LogStr' using a buffer in blocking mode.
  --   The size of 'LogStr' must be smaller or equal to
  --   the size of buffer.
  writeLogStr :: Buffer -> IORef FD -> LogStr -> IO ()
  writeLogStr buf fdref (LogStr len builder) =
      toBufIOWith buf len (write fdref) builder
  
  -- | Writting 'LogStr' using a temporary buffer.
  writeBigLogStr :: IORef FD -> LogStr -> IO ()
  writeBigLogStr fdref (LogStr len builder) = allocaBytes len $ \buf ->
      toBufIOWith buf len (write fdref) builder
  
  write :: IORef FD -> Buffer -> Int -> IO ()
  write fdref buf len' = loop buf (fromIntegral len')
    where
      loop bf len = do
          written <- writeRawBufferPtr2FD fdref bf len
          when (0 <= written && written < len) $
              loop (bf `plusPtr` fromIntegral written) (len - written)
  
  ----------------------------------------------------------------
  
  -- | A class for internal loggers.
  class Loggers a where
      stopLoggers :: a -> IO ()
      pushLog :: a -> LogStr -> IO ()
      flushAllLog :: a -> IO ()
  