Skip to content

Commit 1dd2ce2

Browse files
committed
Show-based default debugTraceT[M]Var functions
1 parent b2a45bd commit 1dd2ce2

File tree

5 files changed

+78
-0
lines changed

5 files changed

+78
-0
lines changed

io-classes/src/Control/Concurrent/Class/MonadSTM/TMVar.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ module Control.Concurrent.Class.MonadSTM.TMVar
2424
-- * MonadTraceSTM
2525
, traceTMVar
2626
, traceTMVarIO
27+
, debugTraceTMVar
28+
, debugTraceTMVarIO
2729
) where
2830

2931
import Control.Monad.Class.MonadSTM.Internal

io-classes/src/Control/Concurrent/Class/MonadSTM/TVar.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ module Control.Concurrent.Class.MonadSTM.TVar
2121
-- * MonadTraceSTM
2222
, traceTVar
2323
, traceTVarIO
24+
, debugTraceTVar
25+
, debugTraceTVarIO
2426
) where
2527

2628
import Control.Monad.Class.MonadSTM.Internal

io-classes/src/Control/Monad/Class/MonadSTM/Internal.hs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ module Control.Monad.Class.MonadSTM.Internal
9999
, isEmptyTChanDefault
100100
, cloneTChanDefault
101101
, labelTChanDefault
102+
-- * Trace tvar and tmvar
103+
, debugTraceTVar
104+
, debugTraceTVarIO
105+
, debugTraceTMVar
106+
, debugTraceTMVarIO
102107
) where
103108

104109
import Prelude hiding (read)
@@ -535,6 +540,49 @@ class MonadInspectSTM m
535540
-> m ()
536541
traceTSemIO = \v f -> atomically (traceTSem Proxy v f)
537542

543+
debugTraceTVar :: (MonadTraceSTM m, Show a)
544+
=> proxy m
545+
-> TVar m a
546+
-> STM m ()
547+
debugTraceTVar p tvar =
548+
traceTVar p tvar (\pv v -> pure $ TraceString $ case (pv, v) of
549+
(Nothing, _) -> error "Unreachable"
550+
(Just st', st'') -> "Modified: " <> show st' <> " -> " <> show st''
551+
)
552+
553+
debugTraceTVarIO :: (MonadTraceSTM m, Show a)
554+
=> TVar m a
555+
-> m ()
556+
debugTraceTVarIO tvar =
557+
traceTVarIO tvar (\pv v -> pure $ TraceString $ case (pv, v) of
558+
(Nothing, _) -> error "Unreachable"
559+
(Just st', st'') -> "Modified: " <> show st' <> " -> " <> show st''
560+
)
561+
562+
debugTraceTMVar :: (MonadTraceSTM m, Show a)
563+
=> proxy m
564+
-> TMVar m a
565+
-> STM m ()
566+
debugTraceTMVar p tmvar =
567+
traceTMVar p tmvar (\pv v -> pure $ TraceString $ case (pv, v) of
568+
(Nothing, _) -> error "Unreachable"
569+
(Just Nothing, Just st') -> "Put: " <> show st'
570+
(Just Nothing, Nothing) -> "Remains empty"
571+
(Just Just{}, Nothing) -> "Take"
572+
(Just (Just st'), Just st'') -> "Modified: " <> show st' <> " -> " <> show st''
573+
)
574+
575+
debugTraceTMVarIO :: (Show a, MonadTraceSTM m)
576+
=> TMVar m a
577+
-> m ()
578+
debugTraceTMVarIO tmvar =
579+
traceTMVarIO tmvar (\pv v -> pure $ TraceString $ case (pv, v) of
580+
(Nothing, _) -> error "Unreachable"
581+
(Just Nothing, Just st') -> "Put: " <> show st'
582+
(Just Nothing, Nothing) -> "Remains empty"
583+
(Just Just{}, Nothing) -> "Take"
584+
(Just (Just st'), Just st'') -> "Modified: " <> show st' <> " -> " <> show st''
585+
)
538586

539587
--
540588
-- Instance for IO uses the existing STM library implementations

io-classes/strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TMVar.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ module Control.Concurrent.Class.MonadSTM.Strict.TMVar
3131
-- * MonadTraceSTM
3232
, traceTMVar
3333
, traceTMVarIO
34+
, debugTraceTMVar
35+
, debugTraceTMVarIO
3436
) where
3537

3638

@@ -59,12 +61,23 @@ traceTMVar :: MonadTraceSTM m
5961
-> STM m ()
6062
traceTMVar p (StrictTMVar var) = Lazy.traceTMVar p var
6163

64+
debugTraceTMVar :: (MonadTraceSTM m, Show a)
65+
=> proxy m
66+
-> StrictTMVar m a
67+
-> STM m ()
68+
debugTraceTMVar p (StrictTMVar var) = Lazy.debugTraceTMVar p var
69+
6270
traceTMVarIO :: MonadTraceSTM m
6371
=> StrictTMVar m a
6472
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
6573
-> m ()
6674
traceTMVarIO (StrictTMVar var) = Lazy.traceTMVarIO var
6775

76+
debugTraceTMVarIO :: (MonadTraceSTM m, Show a)
77+
=> StrictTMVar m a
78+
-> m ()
79+
debugTraceTMVarIO (StrictTMVar var) = Lazy.debugTraceTMVarIO var
80+
6881
castStrictTMVar :: LazyTMVar m ~ LazyTMVar n
6982
=> StrictTMVar m a -> StrictTMVar n a
7083
castStrictTMVar (StrictTMVar var) = StrictTMVar var

io-classes/strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TVar.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ module Control.Concurrent.Class.MonadSTM.Strict.TVar
2727
-- * MonadTraceSTM
2828
, traceTVar
2929
, traceTVarIO
30+
, debugTraceTVar
31+
, debugTraceTVarIO
3032
) where
3133

3234
import Control.Concurrent.Class.MonadSTM.TVar qualified as Lazy
@@ -51,12 +53,23 @@ traceTVar :: MonadTraceSTM m
5153
-> STM m ()
5254
traceTVar p StrictTVar {tvar} = Lazy.traceTVar p tvar
5355

56+
debugTraceTVar :: (MonadTraceSTM m, Show a)
57+
=> proxy m
58+
-> StrictTVar m a
59+
-> STM m ()
60+
debugTraceTVar p StrictTVar {tvar} = Lazy.debugTraceTVar p tvar
61+
5462
traceTVarIO :: MonadTraceSTM m
5563
=> StrictTVar m a
5664
-> (Maybe a -> a -> InspectMonad m TraceValue)
5765
-> m ()
5866
traceTVarIO StrictTVar {tvar} = Lazy.traceTVarIO tvar
5967

68+
debugTraceTVarIO :: (MonadTraceSTM m, Show a)
69+
=> StrictTVar m a
70+
-> m ()
71+
debugTraceTVarIO StrictTVar {tvar} = Lazy.debugTraceTVarIO tvar
72+
6073
-- | Cast the monad if both use the same representation of `TVar`s.
6174
--
6275
-- This function is useful for monad transformers stacks if the `TVar` is used

0 commit comments

Comments
 (0)