@@ -315,7 +315,7 @@ import Control.Monad.State.Strict (StateT)
315import Control.Monad.Trans (MonadTrans(lift))
315import Control.Monad.Trans (MonadTrans(lift))
316import Data.Bits (shiftR, shiftL, (.|.), (.&.))
316import Data.Bits (shiftR, shiftL, (.|.), (.&.))
317import Data.Functor.Identity (Identity(..))
317import Data.Functor.Identity (Identity(..))
318−import Data.IORef (newIORef, readIORef, mkWeakIORef, writeIORef, modifyIORef')
318+import Data.IORef (newIORef, readIORef, mkWeakIORef, writeIORef)
319import Data.Maybe (fromJust, isJust, isNothing)
319import Data.Maybe (fromJust, isJust, isNothing)
320import Data.Word (Word32)
320import Data.Word (Word32)
321import Foreign.Ptr (Ptr)
321import Foreign.Ptr (Ptr)
@@ -334,7 +334,8 @@ import qualified Control.Monad.Reader as Reader
334import qualified Control.Monad.State.Strict as State
334import qualified Control.Monad.State.Strict as State
335import qualified Prelude
335import qualified Prelude
337−import Streamly.Internal.Mutable.Prim.Var (MonadMut, Prim, Var, readVar)
337+import Streamly.Internal.Mutable.Prim.Var
338+ (MonadMut, Prim, Var, readVar, newVar, modifyVar')
338import Streamly.Internal.Data.Atomics (atomicModifyIORefCAS_)
339import Streamly.Internal.Data.Atomics (atomicModifyIORefCAS_)
339import Streamly.Internal.Memory.Array.Types (Array(..))
340import Streamly.Internal.Memory.Array.Types (Array(..))
340import Streamly.Internal.Data.Fold.Types (Fold(..))
341import Streamly.Internal.Data.Fold.Types (Fold(..))
@@ -3251,36 +3252,36 @@ tapRate ::
3251tapRate samplingRate action (Stream step state) = Stream step' Nothing
3252tapRate samplingRate action (Stream step state) = Stream step' Nothing
3253 {-# NOINLINE loop #-}
3254 {-# NOINLINE loop #-}
3254− loop countRef prev = do
3255+ loop countVar prev = do
3256 MC.catch
3257 MC.catch
3257 (do liftIO $ threadDelay (round $ samplingRate * 1000000)
3258 (do liftIO $ threadDelay (round $ samplingRate * 1000000)
3258− i <- liftIO $ readIORef countRef
3259+ i <- liftIO $ readVar countVar
3259 let !diff = i - prev
3260 let !diff = i - prev
3260 void $ action diff
3261 void $ action diff
3261 return i)
3262 return i)
3262 (\(e :: AsyncException) -> do
3263 (\(e :: AsyncException) -> do
3263− i <- liftIO $ readIORef countRef
3264+ i <- liftIO $ readVar countVar
3264 let !diff = i - prev
3265 let !diff = i - prev
3265 void $ action diff
3266 void $ action diff
3266 throwM (MC.toException e))
3267 throwM (MC.toException e))
3267− loop countRef i
3268+ loop countVar i
3269 {-# INLINE_LATE step' #-}
3270 {-# INLINE_LATE step' #-}
3270 step' _ Nothing = do
3271 step' _ Nothing = do
3271− countRef <- liftIO $ newIORef 0
3272+ countVar <- liftIO $ newVar 0
3272− tid <- fork $ loop countRef 0
3273+ tid <- fork $ loop countVar 0
3273 ref <- liftIO $ newIORef ()
3274 ref <- liftIO $ newIORef ()
3274 _ <- liftIO $ mkWeakIORef ref (killThread tid)
3275 _ <- liftIO $ mkWeakIORef ref (killThread tid)
3275− return $ Skip (Just (countRef, tid, state, ref))
3276+ return $ Skip (Just (countVar, tid, state, ref))
3277− step' gst (Just (countRef, tid, st, ref)) = do
3278+ step' gst (Just (countVar, tid, st, ref)) = do
3278 r <- step gst st
3279 r <- step gst st
3279 case r of
3280 case r of
3280 Yield x s -> do
3281 Yield x s -> do
3281− liftIO $ modifyIORef' countRef (+ 1)
3282+ liftIO $ modifyVar' countVar (+ 1)
3282− return $ Yield x (Just (countRef, tid, s, ref))
3283+ return $ Yield x (Just (countVar, tid, s, ref))
3283− Skip s -> return $ Skip (Just (countRef, tid, s, ref))
3284+ Skip s -> return $ Skip (Just (countVar, tid, s, ref))
3284 Stop -> do
3285 Stop -> do
3285 liftIO $ killThread tid
3286 liftIO $ killThread tid
3286 return Stop
3287 return Stop