diff options
Diffstat (limited to 'haskell/Data/Primitive/ByteArray/Util.hs')
-rw-r--r-- | haskell/Data/Primitive/ByteArray/Util.hs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/haskell/Data/Primitive/ByteArray/Util.hs b/haskell/Data/Primitive/ByteArray/Util.hs index 1776286..de944e7 100644 --- a/haskell/Data/Primitive/ByteArray/Util.hs +++ b/haskell/Data/Primitive/ByteArray/Util.hs | |||
@@ -9,10 +9,16 @@ | |||
9 | {-# LANGUAGE TypeOperators #-} | 9 | {-# LANGUAGE TypeOperators #-} |
10 | module Data.Primitive.ByteArray.Util where | 10 | module Data.Primitive.ByteArray.Util where |
11 | 11 | ||
12 | import GHC.Exts (Ptr(..)) | ||
12 | import GHC.TypeLits | 13 | import GHC.TypeLits |
13 | import Control.Monad.Primitive | 14 | import Control.Monad.Primitive |
15 | import qualified Data.ByteString as B | ||
16 | import qualified Data.ByteString.Unsafe as B | ||
17 | import Data.Primitive.Addr | ||
14 | import Data.Primitive.Types | 18 | import Data.Primitive.Types |
15 | import Data.Primitive.ByteArray | 19 | import Data.Primitive.ByteArray |
20 | import Data.Word | ||
21 | import Foreign.Ptr | ||
16 | 22 | ||
17 | newtype Offset (n :: Nat) = Offset Int | 23 | newtype Offset (n :: Nat) = Offset Int |
18 | 24 | ||
@@ -43,3 +49,18 @@ readAtByte :: forall a m n. | |||
43 | ) => MutableByteArray (PrimState m) -> Offset n -> m a | 49 | ) => MutableByteArray (PrimState m) -> Offset n -> m a |
44 | readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a))) | 50 | readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a))) |
45 | {-# INLINE readAtByte #-} | 51 | {-# INLINE readAtByte #-} |
52 | |||
53 | writeStringAt :: PrimMonad m => MutableByteArray s -> Int -> B.ByteString -> m (Ptr a) | ||
54 | writeStringAt src o bsname = do | ||
55 | (p,cnt) <- unsafeIOToPrim $ B.unsafeUseAsCStringLen bsname return | ||
56 | let nptr = ptr (mutableByteArrayContents src) `plusPtr` o | ||
57 | copyAddr (adr nptr) (adr p) cnt | ||
58 | writeOffAddr (adr nptr) cnt (0 :: Word8) | ||
59 | return nptr | ||
60 | |||
61 | ptr :: Addr -> Ptr a | ||
62 | ptr (Addr a) = Ptr a | ||
63 | |||
64 | adr :: Ptr a -> Addr | ||
65 | adr (Ptr a) = Addr a | ||
66 | |||