Add unsafeThawByteArray
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 24 May 2010 07:04:36 +0000 (07:04 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 24 May 2010 07:04:36 +0000 (07:04 +0000)
Data/Primitive/ByteArray.hs

index 79ffeaf..c568705 100644 (file)
@@ -17,7 +17,7 @@ module Data.Primitive.ByteArray (
 
   newByteArray, newPinnedByteArray, newAlignedPinnedByteArray,
   readByteArray, writeByteArray, indexByteArray,
-  unsafeFreezeByteArray,
+  unsafeFreezeByteArray, unsafeThawByteArray,
   sizeofByteArray, sizeofMutableByteArray, sameMutableByteArray,
   byteArrayContents,
 
@@ -88,6 +88,14 @@ unsafeFreezeByteArray (MutableByteArray arr#)
   = primitive (\s# -> case unsafeFreezeByteArray# arr# s# of
                         (# s'#, arr'# #) -> (# s'#, ByteArray arr'# #))
 
+-- | Convert an immutable byte array to a mutable one without copying. The
+-- original array should not be used after the conversion.
+unsafeThawByteArray
+  :: PrimMonad m => ByteArray -> m (MutableByteArray (PrimState m))
+{-# INLINE unsafeThawByteArray #-}
+unsafeThawByteArray (ByteArray arr#)
+  = primitive (\s# -> (# s#, MutableByteArray (unsafeCoerce# arr#) #))
+
 -- | Size of the byte array.
 sizeofByteArray :: ByteArray -> Int
 {-# INLINE sizeofByteArray #-}