@@ -53,10 +53,9 @@ module Streamly.Internal.Data.Array.Mut.Type
53 , writeNWithUnsafe
53 , writeNWithUnsafe
54 , writeNWith
54 , writeNWith
55 , writeNUnsafe
55 , writeNUnsafe
56− , writeNUnsafeAs
56+ , pinnedWriteNUnsafe
58 , pinnedWriteN
58 , pinnedWriteN
60 , pinnedWriteNAligned
59 , pinnedWriteNAligned
62 , writeWith
61 , writeWith
@@ -189,8 +188,7 @@ module Streamly.Internal.Data.Array.Mut.Type
190 -- ** Construct from streams
189 -- ** Construct from streams
191 , chunksOf
190 , chunksOf
192− , chunksOfAs
191+ , pinnedChunksOf
193− , arrayStreamKFromStreamD
194 , writeChunks
192 , writeChunks
196 -- ** Eliminate to streams
194 -- ** Eliminate to streams
@@ -429,7 +427,7 @@ newBytesAs :: MonadIO m =>
430 PinnedState -> Int -> m (MutArray a)
428 PinnedState -> Int -> m (MutArray a)
431newBytesAs ps bytes = do
429newBytesAs ps bytes = do
432− contents <- liftIO $ Unboxed.newBytes ps bytes
430+ contents <- liftIO $ Unboxed.newBytesAs ps bytes
433 return $ MutArray
431 return $ MutArray
434 { arrContents = contents
432 { arrContents = contents
435 , arrStart = 0
433 , arrStart = 0
@@ -463,7 +461,7 @@ pinnedNewAligned =
463newAs :: (MonadIO m, Unbox a) => PinnedState -> Int -> m (MutArray a)
461newAs :: (MonadIO m, Unbox a) => PinnedState -> Int -> m (MutArray a)
464newAs ps =
462newAs ps =
465 newArrayWith
463 newArrayWith
466− (\s _ -> liftIO $ Unboxed.newBytes ps s)
464+ (\s _ -> liftIO $ Unboxed.newBytesAs ps s)
467 (error "new: alignment is not used in unpinned arrays.")
465 (error "new: alignment is not used in unpinned arrays.")
469-- XXX can unaligned allocation be more efficient when alignment is not needed?
467-- XXX can unaligned allocation be more efficient when alignment is not needed?
@@ -742,7 +740,7 @@ reallocExplicit elemSize newCapacityInBytes MutArray{..} = do
742 contents <-
740 contents <-
743 if Unboxed.isPinned arrContents
741 if Unboxed.isPinned arrContents
744 then Unboxed.pinnedNewBytes newCapMaxInBytes
742 then Unboxed.pinnedNewBytes newCapMaxInBytes
745− else Unboxed.newUnpinnedBytes newCapMaxInBytes
743+ else Unboxed.newBytes newCapMaxInBytes
746 let !(MutableByteArray mbarrFrom#) = arrContents
744 let !(MutableByteArray mbarrFrom#) = arrContents
747 !(MutableByteArray mbarrTo#) = contents
745 !(MutableByteArray mbarrTo#) = contents
@@ -1362,6 +1360,16 @@ chunksOf :: forall m a. (MonadIO m, Unbox a)
1362-- chunksOf n = D.foldMany (writeN n)
1360-- chunksOf n = D.foldMany (writeN n)
1363chunksOf = chunksOfAs Unpinned
1361chunksOf = chunksOfAs Unpinned
1363+-- | Like 'chunksOf' but creates pinned arrays.
1364+{-# INLINE_NORMAL pinnedChunksOf #-}
1365+pinnedChunksOf :: forall m a. (MonadIO m, Unbox a)
1366+ => Int -> D.Stream m a -> D.Stream m (MutArray a)
1367+-- pinnedChunksOf n = D.foldMany (pinnedWriteN n)
1368+pinnedChunksOf = chunksOfAs Pinned
1370+-- XXX This should take a PinnedState
1371+-- XXX buffer to a list instead?
1372+-- | Buffer the stream into arrays in memory.
1365{-# INLINE arrayStreamKFromStreamDAs #-}
1373{-# INLINE arrayStreamKFromStreamDAs #-}
1366arrayStreamKFromStreamDAs :: forall m a. (MonadIO m, Unbox a) =>
1374arrayStreamKFromStreamDAs :: forall m a. (MonadIO m, Unbox a) =>
1367 PinnedState -> D.Stream m a -> m (StreamK m (MutArray a))
1375 PinnedState -> D.Stream m a -> m (StreamK m (MutArray a))
@@ -1369,14 +1377,6 @@ arrayStreamKFromStreamDAs ps =
1369 let n = allocBytesToElemCount (undefined :: a) defaultChunkSize
1377 let n = allocBytesToElemCount (undefined :: a) defaultChunkSize
1370 in D.foldr K.cons K.nil . chunksOfAs ps n
1378 in D.foldr K.cons K.nil . chunksOfAs ps n
1372−-- XXX This should take a PinnedState
1373−-- XXX buffer to a list instead?
1374−-- | Buffer the stream into arrays in memory.
1375−{-# INLINE arrayStreamKFromStreamD #-}
1376−arrayStreamKFromStreamD :: forall m a. (MonadIO m, Unbox a) =>
1377− D.Stream m a -> m (StreamK m (MutArray a))
1378−arrayStreamKFromStreamD = arrayStreamKFromStreamDAs Pinned
1380-------------------------------------------------------------------------------
1380-------------------------------------------------------------------------------
1381-- Streams of arrays - Flattening
1381-- Streams of arrays - Flattening
1382-------------------------------------------------------------------------------
1382-------------------------------------------------------------------------------
@@ -1787,6 +1787,12 @@ writeNUnsafe :: forall m a. (MonadIO m, Unbox a)
1787 => Int -> Fold m a (MutArray a)
1787 => Int -> Fold m a (MutArray a)
1788writeNUnsafe = writeNUnsafeAs Unpinned
1788writeNUnsafe = writeNUnsafeAs Unpinned
1790+-- | Like 'writeNUnsafe' but creates a pinned array.
1791+{-# INLINE_NORMAL pinnedWriteNUnsafe #-}
1792+pinnedWriteNUnsafe :: forall m a. (MonadIO m, Unbox a)
1793+ => Int -> Fold m a (MutArray a)
1794+pinnedWriteNUnsafe = writeNUnsafeAs Pinned
1790-- | @writeNWith alloc n@ folds a maximum of @n@ elements into an array
1796-- | @writeNWith alloc n@ folds a maximum of @n@ elements into an array
1791-- allocated using the @alloc@ function.
1797-- allocated using the @alloc@ function.
@@ -1817,6 +1823,7 @@ writeNAs ps = writeNWith (newAs ps)
1817writeN :: forall m a. (MonadIO m, Unbox a) => Int -> Fold m a (MutArray a)
1823writeN :: forall m a. (MonadIO m, Unbox a) => Int -> Fold m a (MutArray a)
1818writeN = writeNAs Unpinned
1824writeN = writeNAs Unpinned
1826+-- | Like 'writeN' but creates a pinned array.
1820{-# INLINE_NORMAL pinnedWriteN #-}
1827{-# INLINE_NORMAL pinnedWriteN #-}
1821pinnedWriteN ::
1828pinnedWriteN ::
1822 forall m a. (MonadIO m, Unbox a)
1829 forall m a. (MonadIO m, Unbox a)
@@ -1959,6 +1966,7 @@ writeWith = writeWithAs Unpinned
1959write :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
1966write :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
1960write = writeWith (allocBytesToElemCount (undefined :: a) arrayChunkBytes)
1967write = writeWith (allocBytesToElemCount (undefined :: a) arrayChunkBytes)
1969+-- | Like 'write' but creates a pinned array.
1962{-# INLINE pinnedWrite #-}
1970{-# INLINE pinnedWrite #-}
1963pinnedWrite :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
1971pinnedWrite :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
1964pinnedWrite =
1972pinnedWrite =
@@ -2000,6 +2008,7 @@ fromStreamDN = fromStreamDNAs Unpinned
2000fromListN :: (MonadIO m, Unbox a) => Int -> [a] -> m (MutArray a)
2008fromListN :: (MonadIO m, Unbox a) => Int -> [a] -> m (MutArray a)
2001fromListN n xs = fromStreamDN n $ D.fromList xs
2009fromListN n xs = fromStreamDN n $ D.fromList xs
2011+-- | Like 'fromListN' but creates a pinned array.
2003{-# INLINABLE pinnedFromListN #-}
2012{-# INLINABLE pinnedFromListN #-}
2004pinnedFromListN :: (MonadIO m, Unbox a) => Int -> [a] -> m (MutArray a)
2013pinnedFromListN :: (MonadIO m, Unbox a) => Int -> [a] -> m (MutArray a)
2005pinnedFromListN n xs = fromStreamDNAs Pinned n $ D.fromList xs
2014pinnedFromListN n xs = fromStreamDNAs Pinned n $ D.fromList xs
@@ -2063,6 +2072,7 @@ fromStreamD = fromStreamDAs Unpinned
2063fromList :: (MonadIO m, Unbox a) => [a] -> m (MutArray a)
2072fromList :: (MonadIO m, Unbox a) => [a] -> m (MutArray a)
2064fromList xs = fromStreamD $ D.fromList xs
2073fromList xs = fromStreamD $ D.fromList xs
2075+-- | Like 'fromList' but creates a pinned array.
2066{-# INLINE pinnedFromList #-}
2076{-# INLINE pinnedFromList #-}
2067pinnedFromList :: (MonadIO m, Unbox a) => [a] -> m (MutArray a)
2077pinnedFromList :: (MonadIO m, Unbox a) => [a] -> m (MutArray a)
2068pinnedFromList xs = fromStreamDAs Pinned $ D.fromList xs
2078pinnedFromList xs = fromStreamDAs Pinned $ D.fromList xs
@@ -2111,8 +2121,8 @@ spliceCopy arr1 arr2 = liftIO $ do
2111 let newLen = len1 + len2
2121 let newLen = len1 + len2
2112 newArrContents <-
2122 newArrContents <-
2113 if Unboxed.isPinned (arrContents arr1)
2123 if Unboxed.isPinned (arrContents arr1)
2114− then Unboxed.newPinnedBytes newLen
2124+ then Unboxed.pinnedNewBytes newLen
2115− else Unboxed.newUnpinnedBytes newLen
2125+ else Unboxed.newBytes newLen
2116 let len = len1 + len2
2126 let len = len1 + len2
2117 newArr = MutArray newArrContents 0 len len
2127 newArr = MutArray newArrContents 0 len len
2118 putSliceUnsafe arr1 start1 newArr 0 len1
2128 putSliceUnsafe arr1 start1 newArr 0 len1