@@ -20,6 +20,7 @@ module Data.Text.Foreign
20 -- * Safe conversion functions
20 -- * Safe conversion functions
22 , useAsPtr
22 , useAsPtr
23 -- * Unsafe conversion code
24 -- * Unsafe conversion code
24 , lengthWord16
25 , lengthWord16
25 , unsafeCopyToPtr
26 , unsafeCopyToPtr
@@ -39,6 +40,7 @@ import qualified Data.Text.Array as A
39import Data.Word (Word16)
40import Data.Word (Word16)
40import Foreign.Marshal.Alloc (allocaBytes)
41import Foreign.Marshal.Alloc (allocaBytes)
41import Foreign.Ptr (Ptr, castPtr, plusPtr)
42import Foreign.Ptr (Ptr, castPtr, plusPtr)
43+import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtrArray, withForeignPtr)
42import Foreign.Storable (peek, poke)
44import Foreign.Storable (peek, poke)
44-- $interop
46-- $interop
@@ -135,3 +137,10 @@ useAsPtr t@(Text _arr _off len) action =
135 allocaBytes (len * 2) $ \buf -> do
137 allocaBytes (len * 2) $ \buf -> do
136 unsafeCopyToPtr t buf
138 unsafeCopyToPtr t buf
137 action (castPtr buf) (fromIntegral len)
139 action (castPtr buf) (fromIntegral len)
141+-- | /O(n)/ Make a mutable copy of a 'Text'.
142+asForeignPtr :: Text -> IO (ForeignPtr Word16, I16)
143+asForeignPtr t@(Text _arr _off len) = do
144+ fp <- mallocForeignPtrArray len
145+ withForeignPtr fp $ unsafeCopyToPtr t
146+ return (fp, I16 len)