summaryrefslogtreecommitdiff
path: root/haskell/Data/Primitive/ByteArray/Util.hs
diff options
context:
space:
mode:
Diffstat (limited to 'haskell/Data/Primitive/ByteArray/Util.hs')
-rw-r--r--haskell/Data/Primitive/ByteArray/Util.hs21
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 #-}
10module Data.Primitive.ByteArray.Util where 10module Data.Primitive.ByteArray.Util where
11 11
12import GHC.Exts (Ptr(..))
12import GHC.TypeLits 13import GHC.TypeLits
13import Control.Monad.Primitive 14import Control.Monad.Primitive
15import qualified Data.ByteString as B
16import qualified Data.ByteString.Unsafe as B
17import Data.Primitive.Addr
14import Data.Primitive.Types 18import Data.Primitive.Types
15import Data.Primitive.ByteArray 19import Data.Primitive.ByteArray
20import Data.Word
21import Foreign.Ptr
16 22
17newtype Offset (n :: Nat) = Offset Int 23newtype 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
44readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a))) 50readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a)))
45{-# INLINE readAtByte #-} 51{-# INLINE readAtByte #-}
52
53writeStringAt :: PrimMonad m => MutableByteArray s -> Int -> B.ByteString -> m (Ptr a)
54writeStringAt 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
61ptr :: Addr -> Ptr a
62ptr (Addr a) = Ptr a
63
64adr :: Ptr a -> Addr
65adr (Ptr a) = Addr a
66