@@ -188,6 +188,8 @@ module Streamly.Streams.StreamD
188188 , toListRev
189189 , toStreamK
190190 , toStreamD
191+ , hoist
192+ , generally
191193
192194 -- * Transformation
193195 , transform
@@ -290,9 +292,7 @@ import Control.Monad.Catch (MonadCatch)
290292import Control.Monad.IO.Class (MonadIO(..))
291293import Control.Monad.Trans (MonadTrans(lift))
292294import Data.Bits (shiftR, shiftL, (.|.), (.&.))
293−#if __GLASGOW_HASKELL__ >= 801
294−import Data.Functor.Identity (Identity)
295−#endif
295+import Data.Functor.Identity (Identity(..))
296296import Data.Maybe (fromJust, isJust)
297297import Data.Word (Word32)
298298import Foreign.Ptr (Ptr)
@@ -635,6 +635,21 @@ fromListM = Stream step
635635toStreamD :: (K.IsStream t, Monad m) => t m a -> Stream m a
636636toStreamD = fromStreamK . K.toStream
637637
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)
641+ where
642+ step' gst st = do
643+ r <- f $ step (adaptState gst) st
644+ return $ case r of
645+ Yield x s -> Yield x s
646+ Skip s -> Skip s
647+ Stop -> Stop
648+
649+{-# INLINE_NORMAL generally #-}
650+generally :: Monad m => Stream Identity a -> Stream m a
651+generally = hoist (return . runIdentity)
652+
638653------------------------------------------------------------------------------
639654-- Elimination by Folds
640655------------------------------------------------------------------------------