on master help sign in
Add asForeignPtr to D.T.F

--HG-- extra : convert_revision : c70801b8060fbc512e07d5b4d3233266dc45bb57

commit320641a4e1a7ea18618fea4a5ac6d6747313c027 authorBryan O'Sullivan <bos@serpentine.com> dateThu 7 Oct 2010, 19:40 (16 years ago) parentd84a2ec
1 file changed+9
Data/Text/Foreign.hs+9
Data/Text/Foreign.hs+9
@@ -20,6 +20,7 @@ module Data.Text.Foreign
2020 -- * Safe conversion functions
2121 , fromPtr
2222 , useAsPtr
23+ , asForeignPtr
2324 -- * Unsafe conversion code
2425 , lengthWord16
2526 , unsafeCopyToPtr
@@ -39,6 +40,7 @@ import qualified Data.Text.Array as A
3940import Data.Word (Word16)
4041import Foreign.Marshal.Alloc (allocaBytes)
4142import Foreign.Ptr (Ptr, castPtr, plusPtr)
43+import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtrArray, withForeignPtr)
4244import Foreign.Storable (peek, poke)
4345
4446-- $interop
@@ -135,3 +137,10 @@ useAsPtr t@(Text _arr _off len) action =
135137 allocaBytes (len * 2) $ \buf -> do
136138 unsafeCopyToPtr t buf
137139 action (castPtr buf) (fromIntegral len)
140+
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)