From 2d01ddf9bffb7be441e2cf1c7071240148839ab5 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Fri, 26 Oct 2018 03:52:01 -0400 Subject: Reorganizing layers. --- haskell/Data/Primitive/ByteArray/Util.hs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'haskell/Data/Primitive') 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 @@ {-# LANGUAGE TypeOperators #-} module Data.Primitive.ByteArray.Util where +import GHC.Exts (Ptr(..)) import GHC.TypeLits import Control.Monad.Primitive +import qualified Data.ByteString as B +import qualified Data.ByteString.Unsafe as B +import Data.Primitive.Addr import Data.Primitive.Types import Data.Primitive.ByteArray +import Data.Word +import Foreign.Ptr newtype Offset (n :: Nat) = Offset Int @@ -43,3 +49,18 @@ readAtByte :: forall a m n. ) => MutableByteArray (PrimState m) -> Offset n -> m a readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a))) {-# INLINE readAtByte #-} + +writeStringAt :: PrimMonad m => MutableByteArray s -> Int -> B.ByteString -> m (Ptr a) +writeStringAt src o bsname = do + (p,cnt) <- unsafeIOToPrim $ B.unsafeUseAsCStringLen bsname return + let nptr = ptr (mutableByteArrayContents src) `plusPtr` o + copyAddr (adr nptr) (adr p) cnt + writeOffAddr (adr nptr) cnt (0 :: Word8) + return nptr + +ptr :: Addr -> Ptr a +ptr (Addr a) = Ptr a + +adr :: Ptr a -> Addr +adr (Ptr a) = Addr a + -- cgit v1.2.3