@@ -311,6 +311,7 @@ module Streamly.Internal.Data.Stream.StreamD
311 -- * Time related
311 -- * Time related
312 , takeByTime
312 , takeByTime
313 , dropByTime
313 , dropByTime
@@ -345,6 +346,7 @@ import qualified Control.Monad.Reader as Reader
345import qualified Control.Monad.State.Strict as State
346import qualified Control.Monad.State.Strict as State
346import qualified Prelude
347import qualified Prelude
349+import Data.Int (Int64)
348import Streamly.Internal.Mutable.Prim.Var
350import Streamly.Internal.Mutable.Prim.Var
349 (Prim, Var, readVar, newVar, modifyVar')
351 (Prim, Var, readVar, newVar, modifyVar')
350import Streamly.Internal.Data.Time.Units
352import Streamly.Internal.Data.Time.Units
@@ -355,6 +357,7 @@ import Streamly.Internal.Memory.Array.Types (Array(..))
355import Streamly.Internal.Data.Fold.Types (Fold(..))
357import Streamly.Internal.Data.Fold.Types (Fold(..))
356import Streamly.Internal.Data.Pipe.Types (Pipe(..), PipeState(..))
358import Streamly.Internal.Data.Pipe.Types (Pipe(..), PipeState(..))
357import Streamly.Internal.Data.Time.Clock (Clock(Monotonic), getTime)
359import Streamly.Internal.Data.Time.Clock (Clock(Monotonic), getTime)
360+import Streamly.Internal.Data.Time.Units (MicroSecond64(..), fromAbsTime, toAbsTime, AbsTime)
358import Streamly.Internal.Data.Unfold.Types (Unfold(..))
361import Streamly.Internal.Data.Unfold.Types (Unfold(..))
359import Streamly.Internal.Data.Strict (Tuple3'(..))
362import Streamly.Internal.Data.Strict (Tuple3'(..))
@@ -4207,3 +4210,26 @@ dropByTime duration (Stream step1 state1) = Stream step (DropByTimeInit state1)
4207 Yield x s -> Yield x (DropByTimeYield s)
4210 Yield x s -> Yield x (DropByTimeYield s)
4208 Skip s -> Skip (DropByTimeYield s)
4211 Skip s -> Skip (DropByTimeYield s)
4209 Stop -> Stop
4212 Stop -> Stop
4214+{-# INLINE_NORMAL currentTime #-}
4215+currentTime :: MonadAsync m => Double -> Stream m AbsTime
4216+currentTime g = Stream step Nothing
4219+ threadDelay $ delayTime
4220+ MicroSecond64 t <- fromAbsTime <$> getTime Monotonic
4221+ modifyVar' timeVar (const t)
4223+ g' = g * 10 ^ (6 :: Int)
4224+ {-# INLINE delayTime #-}
4225+ delayTime = if g' >= fromIntegral (maxBound :: Int)
4228+ {-# INLINE_LATE step #-}
4229+ step _ Nothing = do
4230+ timeVar <- liftIO $ newVar (0 :: Int64)
4231+ tid <- forkManaged $ liftIO $ void $ next timeVar
4232+ return $ Skip $ Just (timeVar, tid)
4233+ step _ s@(Just (timeVar, _)) = do
4234+ a <- liftIO $ readVar timeVar
4235+ return $ Yield (toAbsTime (MicroSecond64 a)) s