@@ -188,6 +188,8 @@ module Streamly.Streams.StreamD
188 , toListRev
188 , toListRev
189 , toStreamK
189 , toStreamK
190 , toStreamD
190 , toStreamD
192 -- * Transformation
194 -- * Transformation
193 , transform
195 , transform
@@ -290,9 +292,7 @@ import Control.Monad.Catch (MonadCatch)
290import Control.Monad.IO.Class (MonadIO(..))
292import Control.Monad.IO.Class (MonadIO(..))
291import Control.Monad.Trans (MonadTrans(lift))
293import Control.Monad.Trans (MonadTrans(lift))
292import Data.Bits (shiftR, shiftL, (.|.), (.&.))
294import Data.Bits (shiftR, shiftL, (.|.), (.&.))
293−#if __GLASGOW_HASKELL__ >= 801
294−import Data.Functor.Identity (Identity)
295+import Data.Functor.Identity (Identity(..))
296import Data.Maybe (fromJust, isJust)
296import Data.Maybe (fromJust, isJust)
297import Data.Word (Word32)
297import Data.Word (Word32)
298import Foreign.Ptr (Ptr)
298import Foreign.Ptr (Ptr)
@@ -635,6 +635,21 @@ fromListM = Stream step
635toStreamD :: (K.IsStream t, Monad m) => t m a -> Stream m a
635toStreamD :: (K.IsStream t, Monad m) => t m a -> Stream m a
636toStreamD = fromStreamK . K.toStream
636toStreamD = fromStreamK . K.toStream
638+{-# INLINE_NORMAL hoist #-}
639+hoist :: Monad n => (forall x. m x -> n x) -> Stream m a -> Stream n a
640+hoist f (Stream step state) = (Stream step' state)
643+ r <- f $ step (adaptState gst) st
645+ Yield x s -> Yield x s
649+{-# INLINE_NORMAL generally #-}
650+generally :: Monad m => Stream Identity a -> Stream m a
651+generally = hoist (return . runIdentity)
638------------------------------------------------------------------------------
653------------------------------------------------------------------------------
639-- Elimination by Folds
654-- Elimination by Folds
640------------------------------------------------------------------------------
655------------------------------------------------------------------------------