on master help sign in
Remove MonadIO constraint on Array.Generic.reader
5cab923Adithya Kumar
core/src/Streamly/Internal/Data/Array/Generic.hs+8−3
@@ -61,13 +61,15 @@ import Streamly.Internal.Data.Fold.Type (Fold(..))
61import Streamly.Internal.Data.Stream.Type (Stream)
61import Streamly.Internal.Data.Stream.Type (Stream)
62import Streamly.Internal.Data.Tuple.Strict (Tuple'(..), Tuple3'(..))
62import Streamly.Internal.Data.Tuple.Strict (Tuple'(..), Tuple3'(..))
63import Streamly.Internal.Data.Unfold.Type (Unfold(..))
63import Streamly.Internal.Data.Unfold.Type (Unfold(..))
64+import Streamly.Internal.System.IO (unsafeInlineIO)
64
65
65import qualified Streamly.Internal.Data.Array.Generic.Mut.Type as MArray
66import qualified Streamly.Internal.Data.Array.Generic.Mut.Type as MArray
66import qualified Streamly.Internal.Data.Fold.Type as FL
67import qualified Streamly.Internal.Data.Fold.Type as FL
68+import qualified Streamly.Internal.Data.Producer.Type as Producer
69+import qualified Streamly.Internal.Data.Producer as Producer
67import qualified Streamly.Internal.Data.Ring as RB
70import qualified Streamly.Internal.Data.Ring as RB
68import qualified Streamly.Internal.Data.Stream.StreamD as D
71import qualified Streamly.Internal.Data.Stream.StreamD as D
69import qualified Streamly.Internal.Data.Stream.Type as Stream
72import qualified Streamly.Internal.Data.Stream.Type as Stream
70−import qualified Streamly.Internal.Data.Unfold as Unfold
71import qualified Text.ParserCombinators.ReadPrec as ReadPrec
73import qualified Text.ParserCombinators.ReadPrec as ReadPrec
72
74
73import Data.IORef
75import Data.IORef
@@ -174,8 +176,11 @@ length :: Array a -> Int
174length = arrLen
176length = arrLen
175
177
176{-# INLINE_NORMAL reader #-}
178{-# INLINE_NORMAL reader #-}
177−reader :: MonadIO m => Unfold m (Array a) a
179+reader :: Monad m => Unfold m (Array a) a
178−reader = Unfold.lmap unsafeThaw MArray.reader
180+reader =
181+ Producer.simplify
182+ $ Producer.translate unsafeThaw unsafeFreeze
183+ $ MArray.producerWith (return . unsafeInlineIO)
179
184
180-------------------------------------------------------------------------------
185-------------------------------------------------------------------------------
181-- Elimination - to streams
186-- Elimination - to streams
core/src/Streamly/Internal/Data/Array/Generic/Mut/Type.hs+11−4
@@ -87,6 +87,7 @@ module Streamly.Internal.Data.Array.Generic.Mut.Type
87 -- ** Unfolds
87 -- ** Unfolds
88 , reader
88 , reader
89 -- , readerRev
89 -- , readerRev
90+ , producerWith -- experimental
90 , producer -- experimental
91 , producer -- experimental
91
92
92 -- ** To containers
93 -- ** To containers
@@ -545,9 +546,9 @@ writeN n = FL.take n $ writeNUnsafe n
545
546
546-- | Resumable unfold of an array.
547-- | Resumable unfold of an array.
547--
548--
548−{-# INLINE_NORMAL producer #-}
549+{-# INLINE_NORMAL producerWith #-}
549−producer :: MonadIO m => Producer m (Array a) a
550+producerWith :: Monad m => (forall b. IO b -> m b) -> Producer m (Array a) a
550−producer = Producer step inject extract
551+producerWith liftio = Producer step inject extract
551
552
552 where
553 where
553
554
@@ -562,9 +563,15 @@ producer = Producer step inject extract
562 step (arr, i)
563 step (arr, i)
563 | assert (arrLen arr >= 0) (i == arrLen arr) = return D.Stop
564 | assert (arrLen arr >= 0) (i == arrLen arr) = return D.Stop
564 step (arr, i) = do
565 step (arr, i) = do
565− x <- getIndexUnsafe arr i
566+ x <- liftio $ getIndexUnsafe arr i
566 return $ D.Yield x (arr, i + 1)
567 return $ D.Yield x (arr, i + 1)
567
568
569+-- | Resumable unfold of an array.
570+--
571+{-# INLINE_NORMAL producer #-}
572+producer :: MonadIO m => Producer m (Array a) a
573+producer = producerWith liftIO
574+
568-- | Unfold an array into a stream.
575-- | Unfold an array into a stream.
569--
576--
570{-# INLINE_NORMAL reader #-}
577{-# INLINE_NORMAL reader #-}