@@ -252,8 +252,10 @@ module Data.Vector.SEXP
252252 -- ** SEXP specific helpers.
253253 , toString
254254 , toByteString
255+ , unsafeWithByteString
255256 ) where
256257
258+ import Control.Exception (evaluate )
257259import Control.Monad.R.Class
258260import Control.Monad.R.Internal
259261import Control.Memory.Region
@@ -265,7 +267,6 @@ import Foreign.R ( SEXP(..) )
265267import qualified Foreign.R as R
266268import Foreign.R.Type ( SEXPTYPE (Char ) )
267269
268- import Control.Monad.Primitive ( PrimMonad )
269270import Control.Monad.ST (ST , runST )
270271import Data.Int
271272import Data.Proxy (Proxy (.. ))
@@ -274,6 +275,7 @@ import qualified Data.Vector.Generic as G
274275import Data.Vector.Generic.New (run )
275276import Data.ByteString ( ByteString )
276277import qualified Data.ByteString as B
278+ import qualified Data.ByteString.Unsafe as B
277279
278280import Control.Applicative hiding (empty )
279281#if MIN_VERSION_vector(0,11,0)
@@ -288,7 +290,8 @@ import qualified Data.Vector.Fusion.Stream as Stream
288290import qualified Data.Vector.Fusion.Stream.Monadic as MStream
289291#endif
290292
291- import Control.Monad.Primitive ( unsafeInlineIO , unsafePrimToPrim )
293+ import Control.Monad.Primitive ( PrimMonad , unsafeInlineIO , unsafePrimToPrim )
294+ import qualified Control.DeepSeq as DeepSeq
292295import Data.Word ( Word8 )
293296import Foreign ( Storable , Ptr , castPtr , peekElemOff )
294297import Foreign.ForeignPtr (ForeignPtr , withForeignPtr )
@@ -455,6 +458,17 @@ toByteString v = unsafeInlineIO $
455458 B. packCStringLen ( castPtr $ unsafeToPtr v
456459 , fromIntegral $ vectorLength v)
457460
461+ -- | This function is unsafe and ByteString should not be used
462+ -- outside of the function. Any change to bytestring will be
463+ -- reflected in the source vector, thus breaking referencial
464+ -- transparancy.
465+ unsafeWithByteString :: DeepSeq. NFData a => Vector s 'Char Word8 -> (ByteString -> IO a ) -> a
466+ unsafeWithByteString v f = unsafeInlineIO $ do
467+ x <- B. unsafePackCStringLen (castPtr $ unsafeToPtr v
468+ ,fromIntegral $ vectorLength v)
469+ w <- DeepSeq. force <$> f x
470+ evaluate w
471+
458472------------------------------------------------------------------------
459473-- Vector API
460474--
0 commit comments