@@ -1383,7 +1383,6 @@ pinnedChunksOf :: forall m a. (MonadIO m, Unbox a)
13831383-- pinnedChunksOf n = D.foldMany (pinnedWriteN n)
13841384pinnedChunksOf = chunksOfAs Pinned
13851385
1386−-- XXX This should take a PinnedState
13871386-- XXX buffer to a list instead?
13881387-- | Buffer the stream into arrays in memory.
13891388{-# INLINE arrayStreamKFromStreamDAs #-}
@@ -2088,15 +2087,19 @@ arrayStreamKLength as = K.foldl' (+) 0 (K.map length as)
20882087--
20892088{-# INLINE fromArrayStreamK #-}
20902089fromArrayStreamK :: (Unbox a, MonadIO m) =>
2091− StreamK m (MutArray a) -> m (MutArray a)
2092−fromArrayStreamK as = do
2090+ PinnedState -> StreamK m (MutArray a) -> m (MutArray a)
2091+fromArrayStreamK ps as = do
20932092 len <- arrayStreamKLength as
2094− fromStreamDN len $ D.unfoldMany reader $ D.fromStreamK as
2093+ arr <- newAs ps len
2094+ -- XXX is StreamK fold faster or StreamD fold?
2095+ K.foldlM' spliceUnsafe (pure arr) as
2096+ -- fromStreamDN len $ D.unfoldMany reader $ D.fromStreamK as
20952097
20962098{-# INLINE fromStreamDAs #-}
20972099fromStreamDAs ::
20982100 (MonadIO m, Unbox a) => PinnedState -> D.Stream m a -> m (MutArray a)
2099−fromStreamDAs ps m = arrayStreamKFromStreamDAs ps m >>= fromArrayStreamK
2101+fromStreamDAs ps m =
2102+ arrayStreamKFromStreamDAs Unpinned m >>= fromArrayStreamK ps
21002103
21012104-- CAUTION: a very large number (millions) of arrays can degrade performance
21022105-- due to GC overhead because we need to buffer the arrays before we flatten