{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE Trustworthy #-}
module System.Log.FastLogger.IO where
import Data.ByteString.Builder.Extra (Next(..))
import qualified Data.ByteString.Builder.Extra as BBE
import Data.ByteString.Internal (ByteString(..))
import Data.Word (Word8)
import Foreign.ForeignPtr (withForeignPtr)
import Foreign.Marshal.Alloc (mallocBytes, free)
import Foreign.Ptr (Ptr, plusPtr)
import System.Log.FastLogger.LogStr
type Buffer = Ptr Word8
type BufSize = Int
defaultBufSize :: BufSize
defaultBufSize = 4096
getBuffer :: BufSize -> IO Buffer
getBuffer = mallocBytes
freeBuffer :: Buffer -> IO ()
freeBuffer = free
toBufIOWith :: Buffer -> BufSize -> (Buffer -> Int -> IO ()) -> Builder -> IO ()
toBufIOWith buf !size io builder = loop $ BBE.runBuilder builder
where
loop writer = do
(len, next) <- writer buf size
io buf len
case next of
Done -> return ()
More minSize writer'
| size < minSize -> error "toBufIOWith: More: minSize"
| otherwise -> loop writer'
Chunk (PS fptr off siz) writer' ->
withForeignPtr fptr $ \ptr -> io (ptr `plusPtr` off) siz >> loop writer'