-- | Provides conversion functions between strict @ByteString@s and storable
-- @Vector@s.
module Data.ByteVector
    ( toByteVector
    , fromByteVector
    ) where

import           Data.ByteString.Internal (ByteString (PS))
import           Data.Vector.Storable     (Vector, unsafeFromForeignPtr,
                                           unsafeToForeignPtr)
import           Data.Word                (Word8)

-- | Convert a @ByteString@ into a storable @Vector@.
--
-- Since 0.6.1
toByteVector :: ByteString -> Vector Word8
toByteVector (PS fptr offset idx) = unsafeFromForeignPtr fptr offset idx
{-# INLINE toByteVector #-}

-- | Convert a storable @Vector@ into a @ByteString@.
--
-- Since 0.6.1
fromByteVector :: Vector Word8 -> ByteString
fromByteVector v =
    PS fptr offset idx
  where
    (fptr, offset, idx) = unsafeToForeignPtr v
{-# INLINE fromByteVector #-}