@@ -20,7 +20,6 @@ module Streamly.Internal.Data.Array.Foreign.Mut.Type
20 , ArrayContents
20 , ArrayContents
21 , arrayToFptrContents
21 , arrayToFptrContents
22 , fptrToArrayContents
22 , fptrToArrayContents
24 , nilArrayContents
23 , nilArrayContents
@@ -332,13 +331,6 @@ fptrToArrayContents _ = error "Unsupported foreign ptr"
332arrayToFptrContents (ArrayContents contents) = PlainPtr contents
331arrayToFptrContents (ArrayContents contents) = PlainPtr contents
335−-- | Similar to unsafeWithForeignPtr.
336−unsafeWithArray :: MonadIO m => Array a -> (Ptr a -> m b) -> m b
337−unsafeWithArray Array{..} f = do
339− liftIO $ touch arrContents
342-------------------------------------------------------------------------------
334-------------------------------------------------------------------------------
343-- Array Data Type
335-- Array Data Type
344-------------------------------------------------------------------------------
336-------------------------------------------------------------------------------
@@ -530,7 +522,7 @@ withNewArrayUnsafe ::
530 (MonadIO m, Storable a) => Int -> (Ptr a -> m ()) -> m (Array a)
522 (MonadIO m, Storable a) => Int -> (Ptr a -> m ()) -> m (Array a)
531withNewArrayUnsafe count f = do
523withNewArrayUnsafe count f = do
532 arr <- newArray count
524 arr <- newArray count
533− unsafeWithArray arr
525+ asPtrUnsafe arr
534 $ \p -> f p >> return arr
526 $ \p -> f p >> return arr
536-------------------------------------------------------------------------------
528-------------------------------------------------------------------------------
@@ -545,7 +537,7 @@ withNewArrayUnsafe count f = do
545putIndexUnsafe :: forall m a. (MonadIO m, Storable a)
537putIndexUnsafe :: forall m a. (MonadIO m, Storable a)
546 => Int -> a -> Array a -> m ()
538 => Int -> a -> Array a -> m ()
547putIndexUnsafe i x arr@(Array{..}) =
539putIndexUnsafe i x arr@(Array{..}) =
548− unsafeWithArray arr $ \ptr -> do
540+ asPtrUnsafe arr $ \ptr -> do
549 let elemPtr = PTR_INDEX(ptr,i,a)
541 let elemPtr = PTR_INDEX(ptr,i,a)
550 assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
542 assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
551 liftIO $ poke elemPtr x
543 liftIO $ poke elemPtr x
@@ -574,7 +566,7 @@ putIndexPtr start end i x = do
574{-# INLINE putIndex #-}
566{-# INLINE putIndex #-}
575putIndex :: (MonadIO m, Storable a) => Int -> a -> Array a -> m ()
567putIndex :: (MonadIO m, Storable a) => Int -> a -> Array a -> m ()
576putIndex i x arr =
568putIndex i x arr =
577− unsafeWithArray arr
569+ asPtrUnsafe arr
578 $ \p -> putIndexPtr p (aEnd arr) i x
570 $ \p -> putIndexPtr p (aEnd arr) i x
580-- | Write an input stream of (index, value) pairs to an array. Throws an
572-- | Write an input stream of (index, value) pairs to an array. Throws an
@@ -600,7 +592,7 @@ putIndices Array{..} = FL.mkFoldM step initial extract
600modifyIndexUnsafe :: forall m a b. (MonadIO m, Storable a) =>
592modifyIndexUnsafe :: forall m a b. (MonadIO m, Storable a) =>
601 Int -> (a -> (a, b)) -> Array a -> m b
593 Int -> (a -> (a, b)) -> Array a -> m b
602modifyIndexUnsafe i f arr@(Array{..}) = do
594modifyIndexUnsafe i f arr@(Array{..}) = do
603− liftIO $ unsafeWithArray arr $ \ptr -> do
595+ liftIO $ asPtrUnsafe arr $ \ptr -> do
604 let elemPtr = PTR_INDEX(ptr,i,a)
596 let elemPtr = PTR_INDEX(ptr,i,a)
605 assert (i >= 0 && PTR_NEXT(elemPtr,a) <= aEnd) (return ())
597 assert (i >= 0 && PTR_NEXT(elemPtr,a) <= aEnd) (return ())
606 r <- peek elemPtr
598 r <- peek elemPtr
@@ -627,7 +619,7 @@ modifyIndexPtr i f start end = liftIO $ do
627modifyIndex :: forall m a b. (MonadIO m, Storable a) =>
619modifyIndex :: forall m a b. (MonadIO m, Storable a) =>
628 Int -> (a -> (a, b)) -> Array a -> m b
620 Int -> (a -> (a, b)) -> Array a -> m b
629modifyIndex i f arr@(Array{..}) = do
621modifyIndex i f arr@(Array{..}) = do
630− liftIO $ unsafeWithArray arr $ \ptr -> do
622+ liftIO $ asPtrUnsafe arr $ \ptr -> do
631 modifyIndexPtr i f ptr aEnd
623 modifyIndexPtr i f ptr aEnd
633-- | Modify the array indices generated by the supplied stream.
625-- | Modify the array indices generated by the supplied stream.
@@ -654,7 +646,7 @@ modifyIndices f Array{..} = Fold step initial extract
654modify :: forall m a. (MonadIO m, Storable a)
646modify :: forall m a. (MonadIO m, Storable a)
655 => (a -> a) -> Array a -> m ()
647 => (a -> a) -> Array a -> m ()
656modify f arr@Array{..} = liftIO $
648modify f arr@Array{..} = liftIO $
657− unsafeWithArray arr go
649+ asPtrUnsafe arr go
@@ -681,7 +673,7 @@ swapPtrs ptr1 ptr2 = do
681unsafeSwapIndices :: forall m a. (MonadIO m, Storable a)
673unsafeSwapIndices :: forall m a. (MonadIO m, Storable a)
682 => Int -> Int -> Array a -> m ()
674 => Int -> Int -> Array a -> m ()
683unsafeSwapIndices i1 i2 arr = liftIO $ do
675unsafeSwapIndices i1 i2 arr = liftIO $ do
684− unsafeWithArray arr $ \ptr -> do
676+ asPtrUnsafe arr $ \ptr -> do
685 let ptr1 = PTR_INDEX(ptr,i1,a)
677 let ptr1 = PTR_INDEX(ptr,i1,a)
686 ptr2 = PTR_INDEX(ptr,i2,a)
678 ptr2 = PTR_INDEX(ptr,i2,a)
687 swapPtrs ptr1 (ptr2 :: Ptr a)
679 swapPtrs ptr1 (ptr2 :: Ptr a)
@@ -1048,7 +1040,7 @@ snoc = snocWith f
1048{-# INLINE_NORMAL getIndexUnsafe #-}
1040{-# INLINE_NORMAL getIndexUnsafe #-}
1049getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Int -> Array a -> m a
1041getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Int -> Array a -> m a
1050getIndexUnsafe i arr@(Array {..}) =
1042getIndexUnsafe i arr@(Array {..}) =
1051− unsafeWithArray arr $ \ptr -> do
1043+ asPtrUnsafe arr $ \ptr -> do
1052 let elemPtr = PTR_INDEX(ptr,i,a)
1044 let elemPtr = PTR_INDEX(ptr,i,a)
1053 assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
1045 assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
1054 liftIO $ peek elemPtr
1046 liftIO $ peek elemPtr
@@ -1067,7 +1059,7 @@ getIndexPtr start end i = do
1067{-# INLINE getIndex #-}
1059{-# INLINE getIndex #-}
1068getIndex :: (MonadIO m, Storable a) => Int -> Array a -> m a
1060getIndex :: (MonadIO m, Storable a) => Int -> Array a -> m a
1069getIndex i arr =
1061getIndex i arr =
1070− unsafeWithArray arr
1062+ asPtrUnsafe arr
1071 $ \p -> getIndexPtr p (aEnd arr) i
1063 $ \p -> getIndexPtr p (aEnd arr) i
1073{-# INLINE getIndexPtrRev #-}
1065{-# INLINE getIndexPtrRev #-}
@@ -1087,7 +1079,7 @@ getIndexPtrRev start end i = do
1087{-# INLINE getIndexRev #-}
1079{-# INLINE getIndexRev #-}
1088getIndexRev :: (MonadIO m, Storable a) => Int -> Array a -> m a
1080getIndexRev :: (MonadIO m, Storable a) => Int -> Array a -> m a
1089getIndexRev i arr =
1081getIndexRev i arr =
1090− unsafeWithArray arr
1082+ asPtrUnsafe arr
1091 $ \p -> getIndexPtrRev p (aEnd arr) i
1083 $ \p -> getIndexPtrRev p (aEnd arr) i
1093data GetIndicesState contents start end st =
1085data GetIndicesState contents start end st =
@@ -2241,15 +2233,17 @@ cast arr =
2241 then Nothing
2233 then Nothing
2242 else Just $ castUnsafe arr
2234 else Just $ castUnsafe arr
2244−-- | Use an @Array a@ as @Ptr b@.
2236+-- | Use an @Array a@ as @Ptr a@.
2246-- /Unsafe/
2238-- /Unsafe/
2248-- /Pre-release/
2240-- /Pre-release/
2250−asPtrUnsafe :: Array a -> (Ptr b -> IO c) -> IO c
2242+asPtrUnsafe :: MonadIO m => Array a -> (Ptr a -> m b) -> m b
2251−asPtrUnsafe arr act = do
2243+asPtrUnsafe Array{..} f = do
2252− unsafeWithArray arr $ \ptr -> act (castPtr ptr)
2244+ r <- f arrStart
2245+ liftIO $ touch arrContents
2254-------------------------------------------------------------------------------
2248-------------------------------------------------------------------------------
2255-- Equality
2249-- Equality