{-# LANGUAGE NoImplicitPrelude #-}

module Utils ( unsafeFromForeignPtr0, unsafeToForeignPtr0 ) where

------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------

-- from base:
import Data.Int           ( Int )
import Foreign.Storable   ( Storable )
import Foreign.ForeignPtr ( ForeignPtr )

-- from vector:
import Data.Vector.Storable ( Vector, unsafeFromForeignPtr, unsafeToForeignPtr )

-- TODO: Remove:
import Control.DeepSeq (NFData)
instance NFData (Vector a)

------------------------------------------------------------------------
-- Utils
------------------------------------------------------------------------

unsafeFromForeignPtr0 :: Storable a
                      => ForeignPtr a
                      -> Int
                      -> Vector a
unsafeFromForeignPtr0 fp n = unsafeFromForeignPtr fp 0 n
{-# INLINE unsafeFromForeignPtr0 #-}

unsafeToForeignPtr0 :: Storable a => Vector a -> (ForeignPtr a, Int)
unsafeToForeignPtr0 v = let (fp, _, n) = unsafeToForeignPtr v
                        in (fp, n)
{-# INLINE unsafeToForeignPtr0 #-}