11{-# LANGUAGE BangPatterns #-}
22{-# LANGUAGE ExplicitNamespaces #-}
33{-# LANGUAGE GADTs #-}
4+ {-# LANGUAGE LambdaCase #-}
45{-# LANGUAGE TypeOperators #-}
56
67-- | This module corresponds to `Control.Concurrent.STM.TMVar` in "stm" package
@@ -25,18 +26,22 @@ module Control.Concurrent.Class.MonadSTM.Strict.TMVar
2526 , swapTMVar
2627 , writeTMVar
2728 , isEmptyTMVar
29+ , withTMVar
30+ , withTMVarAnd
2831 -- * MonadLabelledSTM
2932 , labelTMVar
3033 , labelTMVarIO
3134 -- * MonadTraceSTM
3235 , traceTMVar
3336 , traceTMVarIO
37+ , traceTMVarShow
38+ , traceTMVarShowIO
3439 ) where
3540
3641
3742import Control.Concurrent.Class.MonadSTM.TMVar qualified as Lazy
3843import Control.Monad.Class.MonadSTM hiding (traceTMVar , traceTMVarIO )
39-
44+ import Control.Monad.Class.MonadThrow
4045
4146type LazyTMVar m = Lazy. TMVar m
4247
@@ -59,12 +64,39 @@ traceTMVar :: MonadTraceSTM m
5964 -> STM m ()
6065traceTMVar p (StrictTMVar var) = Lazy. traceTMVar p var
6166
67+ traceTMVarShow :: (MonadTraceSTM m , Show a )
68+ => proxy m
69+ -> StrictTMVar m a
70+ -> STM m ()
71+ traceTMVarShow p tmvar =
72+ traceTMVar p tmvar (\ pv v -> pure $ TraceString $ case (pv, v) of
73+ (Nothing , Nothing ) -> " Created empty"
74+ (Nothing , Just st') -> " Created full: " <> show st'
75+ (Just Nothing , Just st') -> " Put: " <> show st'
76+ (Just Nothing , Nothing ) -> " Remains empty"
77+ (Just Just {}, Nothing ) -> " Take"
78+ (Just (Just st'), Just st'') -> " Modified: " <> show st' <> " -> " <> show st''
79+ )
80+
6281traceTMVarIO :: MonadTraceSTM m
6382 => StrictTMVar m a
6483 -> (Maybe (Maybe a ) -> (Maybe a ) -> InspectMonad m TraceValue )
6584 -> m ()
6685traceTMVarIO (StrictTMVar var) = Lazy. traceTMVarIO var
6786
87+ traceTMVarShowIO :: (Show a , MonadTraceSTM m )
88+ => StrictTMVar m a
89+ -> m ()
90+ traceTMVarShowIO tmvar =
91+ traceTMVarIO tmvar (\ pv v -> pure $ TraceString $ case (pv, v) of
92+ (Nothing , Nothing ) -> " Created empty"
93+ (Nothing , Just st') -> " Created full: " <> show st'
94+ (Just Nothing , Just st') -> " Put: " <> show st'
95+ (Just Nothing , Nothing ) -> " Remains empty"
96+ (Just Just {}, Nothing ) -> " Take"
97+ (Just (Just st'), Just st'') -> " Modified: " <> show st' <> " -> " <> show st''
98+ )
99+
68100castStrictTMVar :: LazyTMVar m ~ LazyTMVar n
69101 => StrictTMVar m a -> StrictTMVar n a
70102castStrictTMVar (StrictTMVar var) = StrictTMVar var
@@ -107,3 +139,24 @@ writeTMVar (StrictTMVar tmvar) !a = Lazy.writeTMVar tmvar a
107139
108140isEmptyTMVar :: MonadSTM m => StrictTMVar m a -> STM m Bool
109141isEmptyTMVar (StrictTMVar tmvar) = Lazy. isEmptyTMVar tmvar
142+
143+ withTMVar :: (MonadSTM m , MonadCatch m )
144+ => StrictTMVar m a
145+ -> (a -> m (c , a ))
146+ -> m c
147+ withTMVar (StrictTMVar tmvar) f =
148+ Lazy. withTMVar tmvar (\ x -> do
149+ ! (! c, ! a) <- f x
150+ pure $! (c, a)
151+ )
152+
153+ withTMVarAnd :: (MonadSTM m , MonadCatch m )
154+ => StrictTMVar m a
155+ -> (a -> STM m b )
156+ -> (a -> b -> m (c , a ))
157+ -> m c
158+ withTMVarAnd (StrictTMVar tmvar) f g =
159+ Lazy. withTMVarAnd tmvar f (\ x y -> do
160+ ! (! c, ! a) <- g x y
161+ pure $! (c, a)
162+ )
0 commit comments