@@ -45,6 +45,7 @@ module Streamly.Internal.Data.Array.Foreign.Types
48 , toStreamD
49 , toStreamD
49 , toStreamDRev
50 , toStreamDRev
50 , toStreamK
51 , toStreamK
@@ -97,6 +98,7 @@ import GHC.ForeignPtr (touchForeignPtr, unsafeForeignPtrToPtr)
97import GHC.IO (unsafePerformIO)
98import GHC.IO (unsafePerformIO)
98import GHC.Ptr (Ptr(..))
99import GHC.Ptr (Ptr(..))
99import Streamly.Internal.Data.Fold.Types (Fold(..))
100import Streamly.Internal.Data.Fold.Types (Fold(..))
101+import Streamly.Internal.Data.Unfold.Types (Unfold(..))
100import Text.Read (readPrec, readListPrec, readListPrecDefault)
102import Text.Read (readPrec, readListPrec, readListPrecDefault)
102import Prelude hiding (length, foldr, read, unlines, splitAt)
104import Prelude hiding (length, foldr, read, unlines, splitAt)
@@ -104,6 +106,7 @@ import Prelude hiding (length, foldr, read, unlines, splitAt)
104import qualified Streamly.Internal.Data.Array.Foreign.Mut.Types as MA
106import qualified Streamly.Internal.Data.Array.Foreign.Mut.Types as MA
105import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
107import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
106import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
108import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
109+import qualified Streamly.Internal.Data.Unfold.Types as Unfold
107import qualified GHC.Exts as Exts
110import qualified GHC.Exts as Exts
109#if __GLASGOW_HASKELL__ < 808
112#if __GLASGOW_HASKELL__ < 808
@@ -333,6 +336,12 @@ flattenArrays :: forall m a. (MonadIO m, Storable a)
333 => D.Stream m (Array a) -> D.Stream m a
336 => D.Stream m (Array a) -> D.Stream m a
334flattenArrays = MA.flattenArrays . D.map unsafeThaw
337flattenArrays = MA.flattenArrays . D.map unsafeThaw
339+-- | Use the "readRev" unfold instead.
341+-- @flattenArrays = concatUnfold readRev@
343+-- We can try this if there are any fusion issues in the unfold.
336{-# INLINE_NORMAL flattenArraysRev #-}
345{-# INLINE_NORMAL flattenArraysRev #-}
337flattenArraysRev :: forall m a. (MonadIO m, Storable a)
346flattenArraysRev :: forall m a. (MonadIO m, Storable a)
338 => D.Stream m (Array a) -> D.Stream m a
347 => D.Stream m (Array a) -> D.Stream m a
@@ -377,6 +386,13 @@ byteLength = MA.byteLength . unsafeThaw
377length :: forall a. Storable a => Array a -> Int
386length :: forall a. Storable a => Array a -> Int
378length arr = MA.length (unsafeThaw arr)
387length arr = MA.length (unsafeThaw arr)
389+-- | Unfold an array into a stream in reverse order.
392+{-# INLINE_NORMAL readRev #-}
393+readRev :: forall m a. (Monad m, Storable a) => Unfold m (Array a) a
394+readRev = Unfold.lmap unsafeThaw MA.readRev
380{-# INLINE_NORMAL toStreamD #-}
396{-# INLINE_NORMAL toStreamD #-}
381toStreamD :: forall m a. (Monad m, Storable a) => Array a -> D.Stream m a
397toStreamD :: forall m a. (Monad m, Storable a) => Array a -> D.Stream m a
382toStreamD arr = MA.toStreamD (unsafeThaw arr)
398toStreamD arr = MA.toStreamD (unsafeThaw arr)