@@ -11,27 +11,12 @@ module Streamly.Internal.Data.Stream.Lift
11 -- * Generalize Inner Monad
11 -- * Generalize Inner Monad
13 , generally
13 , generally
15− -- * Transform Inner Monad
27−import Control.Monad.Trans.Reader (ReaderT)
28−import Control.Monad.Trans.State.Strict (StateT)
29−import Control.Monad.Trans.Class (MonadTrans(..))
30import Data.Functor.Identity (Identity (..))
17import Data.Functor.Identity (Identity (..))
31−import Streamly.Internal.Data.Stream.Type
18+import Streamly.Internal.Data.Stream.Type (Stream, fromStreamK, toStreamK)
32− (Stream, fromStreamK, toStreamK, fromStreamD, toStreamD)
34−import qualified Streamly.Internal.Data.Stream.StreamD as D
35import qualified Streamly.Internal.Data.Stream.StreamK as K
20import qualified Streamly.Internal.Data.Stream.StreamK as K
@@ -46,6 +31,7 @@ import qualified Streamly.Internal.Data.Stream.StreamK as K
47-- / Internal/
32-- / Internal/
49{-# INLINE hoist #-}
35{-# INLINE hoist #-}
50hoist :: (Monad m, Monad n)
36hoist :: (Monad m, Monad n)
51 => (forall x. m x -> n x) -> Stream m a -> Stream n a
37 => (forall x. m x -> n x) -> Stream m a -> Stream n a
@@ -55,82 +41,8 @@ hoist f xs = fromStreamK $ K.hoist f (toStreamK xs)
56-- / Internal/
42-- / Internal/
58{-# INLINE generally #-}
46{-# INLINE generally #-}
59generally :: Monad m => Stream Identity a -> Stream m a
47generally :: Monad m => Stream Identity a -> Stream m a
60generally xs = fromStreamK $ K.hoist (return . runIdentity) (toStreamK xs)
48generally xs = fromStreamK $ K.hoist (return . runIdentity) (toStreamK xs)
62−------------------------------------------------------------------------------
63−-- Add and remove a monad transformer
64−------------------------------------------------------------------------------
66−-- | Lift the inner monad @m@ of a stream @Stream m a@ to @tr m@ using the monad
69−{-# INLINE liftInner #-}
70−liftInner :: (Monad m, MonadTrans tr, Monad (tr m))
71− => Stream m a -> Stream (tr m) a
72−liftInner xs = fromStreamD $ D.liftInner (toStreamD xs)
74−------------------------------------------------------------------------------
75−-- Sharing read only state in a stream
76−------------------------------------------------------------------------------
78−-- | Evaluate the inner monad of a stream as 'ReaderT'.
80−{-# INLINE runReaderT #-}
81−runReaderT :: Monad m => m s -> Stream (ReaderT s m) a -> Stream m a
82−runReaderT s xs = fromStreamD $ D.runReaderT s (toStreamD xs)
84−-- | Run a stream transformation using a given environment.
86−-- See also: 'Serial.map'
90−{-# INLINE usingReaderT #-}
94− -> (Stream (ReaderT r m) a -> Stream (ReaderT r m) a)
97−usingReaderT r f xs = runReaderT r $ f $ liftInner xs
99−------------------------------------------------------------------------------
100−-- Sharing read write state in a stream
101−------------------------------------------------------------------------------
103−-- | Evaluate the inner monad of a stream as 'StateT'.
105−-- >>> evalStateT s = fmap snd . Stream.runStateT s
109−{-# INLINE evalStateT #-}
110−evalStateT :: Monad m => m s -> Stream (StateT s m) a -> Stream m a
111−-- evalStateT s = fmap snd . runStateT s
112−evalStateT s xs = fromStreamD $ D.evalStateT s (toStreamD xs)
114−-- | Run a stateful (StateT) stream transformation using a given state.
116−-- >>> usingStateT s f = Stream.evalStateT s . f . Stream.liftInner
122−{-# INLINE usingStateT #-}
126− -> (Stream (StateT s m) a -> Stream (StateT s m) a)
129−usingStateT s f = evalStateT s . f . liftInner
131−-- | Evaluate the inner monad of a stream as 'StateT' and emit the resulting
132−-- state and value pair after each step.
134−{-# INLINE runStateT #-}
135−runStateT :: Monad m => m s -> Stream (StateT s m) a -> Stream m (s, a)
136−runStateT s xs = fromStreamD $ D.runStateT s (toStreamD xs)