1
- {-# LANGUAGE BangPatterns #-}
2
- {-# LANGUAGE CPP #-}
3
- {-# LANGUAGE ExplicitNamespaces #-}
4
- {-# LANGUAGE GADTs #-}
5
- {-# LANGUAGE NamedFieldPuns #-}
6
- {-# LANGUAGE TypeOperators #-}
1
+ {-# LANGUAGE BangPatterns #-}
2
+ {-# LANGUAGE TypeFamilies #-}
3
+ {-# LANGUAGE TypeOperators #-}
7
4
8
5
-- | This module corresponds to `Control.Concurrent.STM.TVar` in "stm" package
9
6
--
@@ -16,17 +13,13 @@ module Control.Concurrent.Class.MonadSTM.Strict.TVar
16
13
, castStrictTVar
17
14
, newTVar
18
15
, newTVarIO
19
- , newTVarWithInvariant
20
- , newTVarWithInvariantIO
21
16
, readTVar
22
17
, readTVarIO
23
18
, writeTVar
24
19
, modifyTVar
25
20
, stateTVar
26
21
, swapTVar
27
22
, check
28
- -- ** Low-level API
29
- , checkInvariant
30
23
-- * MonadLabelSTM
31
24
, labelTVar
32
25
, labelTVarIO
@@ -38,22 +31,11 @@ module Control.Concurrent.Class.MonadSTM.Strict.TVar
38
31
import qualified Control.Concurrent.Class.MonadSTM.TVar as Lazy
39
32
import Control.Monad.Class.MonadSTM hiding (traceTVar , traceTVarIO )
40
33
41
- import GHC.Stack
34
+ type LazyTVar m = Lazy. TVar m
42
35
43
-
44
- type LazyTVar m = Lazy. TVar m
45
-
46
- #if CHECK_TVAR_INVARIANT
47
- data StrictTVar m a = StrictTVar
48
- { invariant :: ! (a -> Maybe String )
49
- -- ^ Invariant checked whenever updating the 'StrictTVar'.
50
- , tvar :: ! (LazyTVar m a )
51
- }
52
- #else
53
- newtype StrictTVar m a = StrictTVar
54
- { tvar :: LazyTVar m a
55
- }
56
- #endif
36
+ newtype StrictTVar m a = StrictTVar {
37
+ tvar :: LazyTVar m a
38
+ }
57
39
58
40
labelTVar :: MonadLabelledSTM m => StrictTVar m a -> String -> STM m ()
59
41
labelTVar StrictTVar { tvar } = Lazy. labelTVar tvar
@@ -76,8 +58,7 @@ traceTVarIO StrictTVar {tvar} = Lazy.traceTVarIO tvar
76
58
77
59
castStrictTVar :: LazyTVar m ~ LazyTVar n
78
60
=> StrictTVar m a -> StrictTVar n a
79
- castStrictTVar v@ StrictTVar {tvar} =
80
- mkStrictTVar (getInvariant v) tvar
61
+ castStrictTVar StrictTVar {tvar} = StrictTVar {tvar}
81
62
82
63
-- | Get the underlying @TVar@
83
64
--
@@ -87,50 +68,22 @@ toLazyTVar :: StrictTVar m a -> LazyTVar m a
87
68
toLazyTVar StrictTVar { tvar } = tvar
88
69
89
70
fromLazyTVar :: LazyTVar m a -> StrictTVar m a
90
- fromLazyTVar tvar =
91
- #if CHECK_TVAR_INVARIANT
92
- StrictTVar { invariant = const Nothing
93
- , tvar
94
- }
95
- #else
96
- StrictTVar { tvar }
97
- #endif
71
+ fromLazyTVar = StrictTVar
98
72
99
73
newTVar :: MonadSTM m => a -> STM m (StrictTVar m a )
100
- newTVar ! a = (\ tvar -> mkStrictTVar (const Nothing ) tvar)
101
- <$> Lazy. newTVar a
74
+ newTVar ! a = StrictTVar <$> Lazy. newTVar a
102
75
103
76
newTVarIO :: MonadSTM m => a -> m (StrictTVar m a )
104
- newTVarIO = newTVarWithInvariantIO (const Nothing )
105
-
106
- newTVarWithInvariant :: (MonadSTM m , HasCallStack )
107
- => (a -> Maybe String ) -- ^ Invariant (expect 'Nothing')
108
- -> a
109
- -> STM m (StrictTVar m a )
110
- newTVarWithInvariant invariant ! a =
111
- checkInvariant (invariant a) $
112
- (\ tvar -> mkStrictTVar invariant tvar)
113
- <$> Lazy. newTVar a
114
-
115
- newTVarWithInvariantIO :: (MonadSTM m , HasCallStack )
116
- => (a -> Maybe String ) -- ^ Invariant (expect 'Nothing')
117
- -> a
118
- -> m (StrictTVar m a )
119
- newTVarWithInvariantIO invariant ! a =
120
- checkInvariant (invariant a) $
121
- (\ tvar -> mkStrictTVar invariant tvar)
122
- <$> Lazy. newTVarIO a
77
+ newTVarIO ! a = StrictTVar <$> Lazy. newTVarIO a
123
78
124
79
readTVar :: MonadSTM m => StrictTVar m a -> STM m a
125
80
readTVar StrictTVar { tvar } = Lazy. readTVar tvar
126
81
127
82
readTVarIO :: MonadSTM m => StrictTVar m a -> m a
128
83
readTVarIO StrictTVar { tvar } = Lazy. readTVarIO tvar
129
84
130
- writeTVar :: (MonadSTM m , HasCallStack ) => StrictTVar m a -> a -> STM m ()
131
- writeTVar v ! a =
132
- checkInvariant (getInvariant v a) $
133
- Lazy. writeTVar (tvar v) a
85
+ writeTVar :: MonadSTM m => StrictTVar m a -> a -> STM m ()
86
+ writeTVar v ! a = Lazy. writeTVar (tvar v) a
134
87
135
88
modifyTVar :: MonadSTM m => StrictTVar m a -> (a -> a ) -> STM m ()
136
89
modifyTVar v f = readTVar v >>= writeTVar v . f
@@ -147,34 +100,3 @@ swapTVar v a' = do
147
100
a <- readTVar v
148
101
writeTVar v a'
149
102
return a
150
-
151
-
152
- {- ------------------------------------------------------------------------------
153
- Dealing with invariants
154
- -------------------------------------------------------------------------------}
155
-
156
- getInvariant :: StrictTVar m a -> a -> Maybe String
157
- mkStrictTVar :: (a -> Maybe String ) -> Lazy. TVar m a -> StrictTVar m a
158
-
159
- -- | Check invariant (if enabled) before continuing
160
- --
161
- -- @checkInvariant mErr x@ is equal to @x@ if @mErr == Nothing@, and throws
162
- -- an error @err@ if @mErr == Just err@.
163
- --
164
- -- This is exported so that other code that wants to conditionally check
165
- -- invariants can reuse the same logic, rather than having to introduce new
166
- -- per-package flags.
167
- checkInvariant :: HasCallStack => Maybe String -> a -> a
168
-
169
- #if CHECK_TVAR_INVARIANT
170
- getInvariant StrictTVar {invariant} = invariant
171
- mkStrictTVar invariant tvar = StrictTVar {invariant, tvar}
172
-
173
- checkInvariant Nothing k = k
174
- checkInvariant (Just err) _ = error $ " Invariant violation: " ++ err
175
- #else
176
- getInvariant _ = \ _ -> Nothing
177
- mkStrictTVar _invariant tvar = StrictTVar {tvar}
178
-
179
- checkInvariant _err k = k
180
- #endif
0 commit comments