5
5
{-# LANGUAGE GADTs #-}
6
6
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7
7
{-# LANGUAGE MultiParamTypeClasses #-}
8
+ {-# LANGUAGE NamedFieldPuns #-}
9
+ {-# LANGUAGE PatternSynonyms #-}
8
10
{-# LANGUAGE RankNTypes #-}
11
+ {-# LANGUAGE ScopedTypeVariables #-}
9
12
{-# LANGUAGE StandaloneDeriving #-}
10
13
{-# LANGUAGE TypeFamilies #-}
11
14
{-# LANGUAGE TypeFamilyDependencies #-}
@@ -16,6 +19,8 @@ module Control.Monad.Class.MonadSTM
16
19
( MonadSTM (.. )
17
20
, MonadLabelledSTM (.. )
18
21
, MonadInspectSTM (.. )
22
+ , TraceValue (TraceValue , TraceDynamic , TraceString , DontTrace , traceDynamic ,
23
+ traceString )
19
24
, MonadTraceSTM (.. )
20
25
, LazyTVar
21
26
, LazyTMVar
@@ -263,106 +268,128 @@ instance MonadInspectSTM IO where
263
268
inspectTMVar _ = atomically . tryReadTMVar
264
269
265
270
271
+ -- | A GADT which instructs how to trace the value. The 'traceDynamic' will
272
+ -- use dynamic tracing, e.g. 'Control.Monad.IOSim.traceM'; while 'traceString'
273
+ -- will be traced with 'EventSay'.
274
+ --
275
+ data TraceValue where
276
+ TraceValue :: forall tr . Typeable tr
277
+ => { traceDynamic :: Maybe tr
278
+ , traceString :: Maybe String
279
+ }
280
+ -> TraceValue
281
+
282
+
283
+ -- | Use only dynamic tracer.
284
+ --
285
+ pattern TraceDynamic :: () => forall tr . Typeable tr => tr -> TraceValue
286
+ pattern TraceDynamic tr <- TraceValue { traceDynamic = Just tr }
287
+ where
288
+ TraceDynamic tr = TraceValue { traceDynamic = Just tr, traceString = Nothing }
289
+
290
+ -- | Use only string tracing.
291
+ --
292
+ pattern TraceString :: String -> TraceValue
293
+ pattern TraceString tr <- TraceValue { traceString = Just tr }
294
+ where
295
+ TraceString tr = TraceValue { traceDynamic = (Nothing :: Maybe () )
296
+ , traceString = Just tr
297
+ }
298
+
299
+ -- | Do not trace the value.
300
+ --
301
+ pattern DontTrace :: TraceValue
302
+ pattern DontTrace <- TraceValue Nothing Nothing
303
+ where
304
+ DontTrace = TraceValue (Nothing :: Maybe () ) Nothing
305
+
266
306
-- | 'MonadTraceSTM' allows to trace values of stm variables when stm
267
- -- transaction is commited . This allows to verify invariants when a variable
268
- -- is commited .
307
+ -- transaction is committed . This allows to verify invariants when a variable
308
+ -- is committed .
269
309
--
270
310
class MonadInspectSTM m
271
311
=> MonadTraceSTM m where
272
312
-- | Construct a trace out of previous & new value of a 'TVar'. The callback
273
313
-- is called whenever an stm transaction which modifies the 'TVar' is
274
- -- commited .
314
+ -- committed .
275
315
--
276
316
-- This is supported by 'IOSim' and 'IOSimPOR'; 'IO' has a trivial instance.
277
317
--
278
318
{-# MINIMAL traceTVar, traceTQueue, traceTBQueue #-}
279
319
280
- traceTVar :: Typeable tr
281
- => proxy m
320
+ traceTVar :: proxy m
282
321
-> TVar m a
283
- -> (Maybe a -> a -> InspectMonad m tr )
322
+ -> (Maybe a -> a -> InspectMonad m TraceValue )
284
323
-- ^ callback which receives initial value or 'Nothing' (if it
285
- -- is a newly created 'TVar'), and the commited value.
324
+ -- is a newly created 'TVar'), and the committed value.
286
325
-> STM m ()
287
326
288
327
289
- traceTMVar :: Typeable tr
290
- => proxy m
328
+ traceTMVar :: proxy m
291
329
-> TMVar m a
292
- -> (Maybe (Maybe a ) -> (Maybe a ) -> InspectMonad m tr )
330
+ -> (Maybe (Maybe a ) -> (Maybe a ) -> InspectMonad m TraceValue )
293
331
-> STM m ()
294
332
295
- traceTQueue :: Typeable tr
296
- => proxy m
333
+ traceTQueue :: proxy m
297
334
-> TQueue m a
298
- -> (Maybe [a ] -> [a ] -> InspectMonad m tr )
335
+ -> (Maybe [a ] -> [a ] -> InspectMonad m TraceValue )
299
336
-> STM m ()
300
337
301
- traceTBQueue :: Typeable tr
302
- => proxy m
338
+ traceTBQueue :: proxy m
303
339
-> TBQueue m a
304
- -> (Maybe [a ] -> [a ] -> InspectMonad m tr )
340
+ -> (Maybe [a ] -> [a ] -> InspectMonad m TraceValue )
305
341
-> STM m ()
306
342
307
343
default traceTMVar :: ( TMVar m a ~ TMVarDefault m a
308
- , Typeable tr
309
344
)
310
345
=> proxy m
311
346
-> TMVar m a
312
- -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr )
347
+ -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue )
313
348
-> STM m ()
314
349
traceTMVar = traceTMVarDefault
315
350
316
351
317
- traceTVarIO :: Typeable tr
318
- => proxy m
352
+ traceTVarIO :: proxy m
319
353
-> TVar m a
320
- -> (Maybe a -> a -> InspectMonad m tr )
354
+ -> (Maybe a -> a -> InspectMonad m TraceValue )
321
355
-> m ()
322
356
323
- traceTMVarIO :: Typeable tr
324
- => proxy m
357
+ traceTMVarIO :: proxy m
325
358
-> TMVar m a
326
- -> (Maybe (Maybe a ) -> (Maybe a ) -> InspectMonad m tr )
359
+ -> (Maybe (Maybe a ) -> (Maybe a ) -> InspectMonad m TraceValue )
327
360
-> m ()
328
361
329
- traceTQueueIO :: Typeable tr
330
- => proxy m
362
+ traceTQueueIO :: proxy m
331
363
-> TQueue m a
332
- -> (Maybe [a ] -> [a ] -> InspectMonad m tr )
364
+ -> (Maybe [a ] -> [a ] -> InspectMonad m TraceValue )
333
365
-> m ()
334
366
335
- traceTBQueueIO :: Typeable tr
336
- => proxy m
367
+ traceTBQueueIO :: proxy m
337
368
-> TBQueue m a
338
- -> (Maybe [a ] -> [a ] -> InspectMonad m tr )
369
+ -> (Maybe [a ] -> [a ] -> InspectMonad m TraceValue )
339
370
-> m ()
340
371
341
- default traceTVarIO :: Typeable tr
342
- => proxy m
372
+ default traceTVarIO :: proxy m
343
373
-> TVar m a
344
- -> (Maybe a -> a -> InspectMonad m tr )
374
+ -> (Maybe a -> a -> InspectMonad m TraceValue )
345
375
-> m ()
346
376
traceTVarIO = \ p v f -> atomically (traceTVar p v f)
347
377
348
- default traceTMVarIO :: Typeable tr
349
- => proxy m
378
+ default traceTMVarIO :: proxy m
350
379
-> TMVar m a
351
- -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr )
380
+ -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue )
352
381
-> m ()
353
382
traceTMVarIO = \ p v f -> atomically (traceTMVar p v f)
354
383
355
- default traceTQueueIO :: Typeable tr
356
- => proxy m
384
+ default traceTQueueIO :: proxy m
357
385
-> TQueue m a
358
- -> (Maybe [a] -> [a] -> InspectMonad m tr )
386
+ -> (Maybe [a] -> [a] -> InspectMonad m TraceValue )
359
387
-> m ()
360
388
traceTQueueIO = \ p v f -> atomically (traceTQueue p v f)
361
389
362
- default traceTBQueueIO :: Typeable tr
363
- => proxy m
390
+ default traceTBQueueIO :: proxy m
364
391
-> TBQueue m a
365
- -> (Maybe [a] -> [a] -> InspectMonad m tr )
392
+ -> (Maybe [a] -> [a] -> InspectMonad m TraceValue )
366
393
-> m ()
367
394
traceTBQueueIO = \ p v f -> atomically (traceTBQueue p v f)
368
395
@@ -480,10 +507,10 @@ labelTMVarDefault
480
507
labelTMVarDefault (TMVar tvar) = labelTVar tvar
481
508
482
509
traceTMVarDefault
483
- :: ( MonadTraceSTM m , Typeable tr )
510
+ :: MonadTraceSTM m
484
511
=> proxy m
485
512
-> TMVarDefault m a
486
- -> (Maybe (Maybe a ) -> Maybe a -> InspectMonad m tr )
513
+ -> (Maybe (Maybe a ) -> Maybe a -> InspectMonad m TraceValue )
487
514
-> STM m ()
488
515
traceTMVarDefault p (TMVar t) f = traceTVar p t f
489
516
@@ -764,7 +791,7 @@ throwSTM :: (MonadSTM m, MonadThrow.MonadThrow (STM m), Exception e)
764
791
throwSTM = MonadThrow. throwIO
765
792
766
793
767
- -- | 'catch' speclialized for an @stm@ monad.
794
+ -- | 'catch' specialized for an @stm@ monad.
768
795
--
769
796
catchSTM :: (MonadSTM m , MonadThrow. MonadCatch (STM m ), Exception e )
770
797
=> STM m a -> (e -> STM m a ) -> STM m a
@@ -797,8 +824,8 @@ deriving instance MonadSTM m => MonadPlus (WrappedSTM t r m)
797
824
-- extension because it violates 3rd Paterson condition, however `STM m` will
798
825
-- resolve to a concrete type of kind (Type -> Type), and thus no larger than
799
826
-- `m` itself, e.g. for `m ~ ReaderT r f`, `STM m ~ WrappedSTM Reader r f`.
800
- -- Instance resolution will termniate as soon as the monad transformer stack
801
- -- depth is exhousted .
827
+ -- Instance resolution will terminate as soon as the monad transformer stack
828
+ -- depth is exhausted .
802
829
instance ( MonadSTM m
803
830
, MonadThrow. MonadThrow (STM m )
804
831
, MonadThrow. MonadCatch (STM m )
0 commit comments