module Data.CompactMap.Fetch where
import Data.CompactMap.Types
import Data.CompactMap.Buffer
import Foreign
import GHC.Ptr
import qualified Data.ByteString.Internal as B
import qualified Data.ByteString.Unsafe as B
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as LBS
import Data.Binary
sizeOfInt :: Int
sizeOfInt = sizeOf (0::Int)
getElement :: (Binary a) => Ptr () -> IO a
getElement ptr
= do size <- peek (castPtr ptr) :: IO Int
extractElement (ptr `plusPtr` (sizeOfInt * 1)) size
extractElement :: Binary a => Ptr () -> Int -> IO a
extractElement !ptr !size
= do bs <- B.unsafePackCStringLen (castPtr ptr, size)
return $! decode (LBS.fromChunks [bs])
extractElementBS :: Ptr () -> Int -> IO B.ByteString
extractElementBS ptr !size
= let n = sizeOf (0::Int)
Ptr addr# = ptr `plusPtr` n
in B.unsafePackAddressLen (sizen) addr#