module Hoogle.Store.ReadBuffer(
Buffer, newBuffer,
setPos, getPos,
getStorable, getByteString,
) where
import General.Base
import General.System
import Foreign
import qualified Data.ByteString as BS
bufferSize = 100 :: Int
data Buffer = Buffer {handle :: Handle, fptr :: ForeignPtr ()}
newBuffer :: Handle -> IO Buffer
newBuffer handle = do
ptr <- mallocForeignPtrBytes bufferSize
return $ Buffer handle ptr
getPos :: Buffer -> IO Word32
getPos Buffer{..} = fmap fromIntegral $ hTell handle
setPos :: Buffer -> Word32 -> IO ()
setPos b@Buffer{..} pos = do
hSeek handle AbsoluteSeek $ fromIntegral pos
getStorable :: forall a . Storable a => Buffer -> IO a
getStorable Buffer{..} = do
let n = sizeOf (undefined :: a)
when (n > bufferSize) $ error $ "Buffer size overflow in getStorable"
withForeignPtr fptr $ \ptr -> do
hGetBuf handle ptr $ sizeOf (undefined :: a)
peek $ castPtr ptr
getByteString :: Buffer -> Int -> IO BString
getByteString Buffer{..} n = BS.hGet handle n