@@ -168,6 +168,7 @@ import Prelude hiding
168168-- $setup
169169-- >>> :m
170170-- >>> import Control.Concurrent (threadDelay)
171+-- >>> import Control.Monad (void)
171172-- >>> import Control.Monad.IO.Class (MonadIO (liftIO))
172173-- >>> import Data.Either (fromLeft, fromRight, isLeft, isRight, either)
173174-- >>> import Data.Function ((&))
@@ -730,6 +731,10 @@ intersperseSuffixBySpan n eff =
730731
731732-- | Insert a side effect before consuming an element of a stream.
732733--
734+-- Definition:
735+--
736+-- >>> interspersePrefix_ m = Stream.mapM (\x -> void m >> return x)
737+--
733738-- >>> input = Stream.fromList "hello"
734739-- >>> Stream.fold Fold.toList $ Stream.trace putChar $ Stream.interspersePrefix_ (putChar '.' >> return ',') input
735740-- .h.e.l.l.o"hello"
@@ -746,24 +751,42 @@ interspersePrefix_ m = mapM (\x -> void m >> return x)
746751-- Inserting Time
747752------------------------------------------------------------------------------
748753
754+-- XXX This should be in Prelude, should we export this as a helper function?
755+
756+-- | Block the current thread for specified number of seconds.
757+{-# INLINE sleep #-}
758+sleep :: MonadIO m => Double -> m ()
759+sleep n = liftIO $ threadDelay $ round $ n * 1000000
760+
749761-- | Introduce a delay of specified seconds between elements of the stream.
750762--
763+-- Definition:
764+--
765+-- >>> sleep n = liftIO $ threadDelay $ round $ n * 1000000
766+-- >>> delay = Stream.intersperseM_ . sleep
767+--
768+-- Example:
769+--
751770-- >>> input = Stream.enumerateFromTo 1 3
752771-- >>> Stream.fold (Fold.drainMapM print) $ Stream.delay 1 input
753772-- 1
754773-- 2
755774-- 3
756775--
757−-- >>> sleep n = liftIO $ threadDelay $ round $ n * 1000000
758−-- >>> delay n = Stream.intersperseM_ $ sleep n
759−--
760776{-# INLINE delay #-}
761777delay :: MonadIO m => Double -> Stream m a -> Stream m a
762−delay n = intersperseM_ $ liftIO $ threadDelay $ round $ n * 1000000
778+delay = intersperseM_ . sleep
763779
764780-- | Introduce a delay of specified seconds after consuming an element of a
765781-- stream.
766782--
783+-- Definition:
784+--
785+-- >>> sleep n = liftIO $ threadDelay $ round $ n * 1000000
786+-- >>> delayPost = Stream.intersperseSuffix_ . sleep
787+--
788+-- Example:
789+--
767790-- >>> input = Stream.enumerateFromTo 1 3
768791-- >>> Stream.fold (Fold.drainMapM print) $ Stream.delayPost 1 input
769792-- 1
@@ -774,11 +797,18 @@ delay n = intersperseM_ $ liftIO $ threadDelay $ round $ n * 1000000
774797--
775798{-# INLINE delayPost #-}
776799delayPost :: MonadIO m => Double -> Stream m a -> Stream m a
777−delayPost n = intersperseSuffix_ $ liftIO $ threadDelay $ round $ n * 1000000
800+delayPost = intersperseSuffix_ . sleep
778801
779802-- | Introduce a delay of specified seconds before consuming an element of a
780803-- stream.
781804--
805+-- Definition:
806+--
807+-- >>> sleep n = liftIO $ threadDelay $ round $ n * 1000000
808+-- >>> delayPre = Stream.interspersePrefix_ . sleep
809+--
810+-- Example:
811+--
782812-- >>> input = Stream.enumerateFromTo 1 3
783813-- >>> Stream.fold (Fold.drainMapM print) $ Stream.delayPre 1 input
784814-- 1
@@ -789,7 +819,7 @@ delayPost n = intersperseSuffix_ $ liftIO $ threadDelay $ round $ n * 1000000
789819--
790820{-# INLINE delayPre #-}
791821delayPre :: MonadIO m => Double -> Stream m a -> Stream m a
792−delayPre n = trace_ $ liftIO $ threadDelay $ round $ n * 1000000
822+delayPre = interspersePrefix_ . sleep
793823
794824------------------------------------------------------------------------------
795825-- Reorder in sequence