@@ -11,27 +11,12 @@ module Streamly.Internal.Data.Stream.Lift
1111 -- * Generalize Inner Monad
1212 hoist
1313 , generally
14−
15− -- * Transform Inner Monad
16− , liftInner
17− , usingReaderT
18− , runReaderT
19− , evalStateT
20− , usingStateT
21− , runStateT
2214 )
2315where
2416
25−#include "inline.hs"
26−
27−import Control.Monad.Trans.Reader (ReaderT)
28−import Control.Monad.Trans.State.Strict (StateT)
29−import Control.Monad.Trans.Class (MonadTrans(..))
3017import Data.Functor.Identity (Identity (..))
31−import Streamly.Internal.Data.Stream.Type
32− (Stream, fromStreamK, toStreamK, fromStreamD, toStreamD)
18+import Streamly.Internal.Data.Stream.Type (Stream, fromStreamK, toStreamK)
3319
34−import qualified Streamly.Internal.Data.Stream.StreamD as D
3520import qualified Streamly.Internal.Data.Stream.StreamK as K
3621
3722-- $setup
@@ -46,6 +31,7 @@ import qualified Streamly.Internal.Data.Stream.StreamK as K
4631--
4732-- / Internal/
4833--
34+-- /CPS/
4935{-# INLINE hoist #-}
5036hoist :: (Monad m, Monad n)
5137 => (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)
5541--
5642-- / Internal/
5743--
44+-- /CPS/
45+--
5846{-# INLINE generally #-}
5947generally :: Monad m => Stream Identity a -> Stream m a
6048generally xs = fromStreamK $ K.hoist (return . runIdentity) (toStreamK xs)
61−
62−------------------------------------------------------------------------------
63−-- Add and remove a monad transformer
64−------------------------------------------------------------------------------
65−
66−-- | Lift the inner monad @m@ of a stream @Stream m a@ to @tr m@ using the monad
67−-- transformer @tr@.
68−--
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)
73−
74−------------------------------------------------------------------------------
75−-- Sharing read only state in a stream
76−------------------------------------------------------------------------------
77−
78−-- | Evaluate the inner monad of a stream as 'ReaderT'.
79−--
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)
83−
84−-- | Run a stream transformation using a given environment.
85−--
86−-- See also: 'Serial.map'
87−--
88−-- / Internal/
89−--
90−{-# INLINE usingReaderT #-}
91−usingReaderT
92− :: Monad m
93− => m r
94− -> (Stream (ReaderT r m) a -> Stream (ReaderT r m) a)
95− -> Stream m a
96− -> Stream m a
97−usingReaderT r f xs = runReaderT r $ f $ liftInner xs
98−
99−------------------------------------------------------------------------------
100−-- Sharing read write state in a stream
101−------------------------------------------------------------------------------
102−
103−-- | Evaluate the inner monad of a stream as 'StateT'.
104−--
105−-- >>> evalStateT s = fmap snd . Stream.runStateT s
106−--
107−-- / Internal/
108−--
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)
113−
114−-- | Run a stateful (StateT) stream transformation using a given state.
115−--
116−-- >>> usingStateT s f = Stream.evalStateT s . f . Stream.liftInner
117−--
118−-- See also: 'scan'
119−--
120−-- / Internal/
121−--
122−{-# INLINE usingStateT #-}
123−usingStateT
124− :: Monad m
125− => m s
126− -> (Stream (StateT s m) a -> Stream (StateT s m) a)
127− -> Stream m a
128− -> Stream m a
129−usingStateT s f = evalStateT s . f . liftInner
130−
131−-- | Evaluate the inner monad of a stream as 'StateT' and emit the resulting
132−-- state and value pair after each step.
133−--
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)