@@ -96,11 +96,8 @@ labelTVarIO v = atomically . labelTVar v
96
96
97
97
castStrictTVar :: LazyTVar m ~ LazyTVar n
98
98
=> StrictTVar m a -> StrictTVar n a
99
- #if CHECK_TVAR_INVARIANT
100
- castStrictTVar StrictTVar {invariant, tvar} = StrictTVar {invariant, tvar}
101
- #else
102
- castStrictTVar StrictTVar { tvar} = StrictTVar { tvar}
103
- #endif
99
+ castStrictTVar v@ StrictTVar {tvar} =
100
+ mkStrictTVar (getInvariant v) tvar
104
101
105
102
-- | Get the underlying @TVar@
106
103
--
@@ -110,11 +107,8 @@ toLazyTVar :: StrictTVar m a -> LazyTVar m a
110
107
toLazyTVar StrictTVar { tvar } = tvar
111
108
112
109
newTVar :: MonadSTM m => a -> STM m (StrictTVar m a )
113
- #if CHECK_TVAR_INVARIANT
114
- newTVar ! a = StrictTVar (const Nothing ) <$> Lazy. newTVar a
115
- #else
116
- newTVar ! a = StrictTVar <$> Lazy. newTVar a
117
- #endif
110
+ newTVar ! a = (\ tvar -> mkStrictTVar (const Nothing ) tvar)
111
+ <$> Lazy. newTVar a
118
112
119
113
newTVarIO :: MonadSTM m => a -> m (StrictTVar m a )
120
114
newTVarIO = newTVarWithInvariantIO (const Nothing )
@@ -127,14 +121,10 @@ newTVarWithInvariantIO :: (MonadSTM m, HasCallStack)
127
121
=> (a -> Maybe String ) -- ^ Invariant (expect 'Nothing')
128
122
-> a
129
123
-> m (StrictTVar m a )
130
- #if CHECK_TVAR_INVARIANT
131
124
newTVarWithInvariantIO invariant ! a =
132
- checkInvariant (invariant a) $
133
- StrictTVar invariant <$> Lazy. newTVarIO a
134
- #else
135
- newTVarWithInvariantIO _invariant ! a =
136
- StrictTVar <$> Lazy. newTVarIO a
137
- #endif
125
+ checkInvariant (invariant a) $
126
+ (\ tvar -> mkStrictTVar invariant tvar)
127
+ <$> Lazy. newTVarIO a
138
128
139
129
newTVarWithInvariantM :: (MonadSTM m , HasCallStack )
140
130
=> (a -> Maybe String ) -- ^ Invariant (expect 'Nothing')
@@ -151,9 +141,7 @@ readTVarIO StrictTVar { tvar } = Lazy.readTVarIO tvar
151
141
152
142
writeTVar :: (MonadSTM m , HasCallStack ) => StrictTVar m a -> a -> STM m ()
153
143
writeTVar v ! a =
154
- #if CHECK_TVAR_INVARIANT
155
- checkInvariant (invariant v a) $
156
- #endif
144
+ checkInvariant (getInvariant v a) $
157
145
Lazy. writeTVar (tvar v) a
158
146
159
147
modifyTVar :: MonadSTM m => StrictTVar m a -> (a -> a ) -> STM m ()
@@ -246,6 +234,9 @@ isEmptyTMVar (StrictTMVar tmvar) = Lazy.isEmptyTMVar tmvar
246
234
Dealing with invariants
247
235
-------------------------------------------------------------------------------}
248
236
237
+ getInvariant :: StrictTVar m a -> a -> Maybe String
238
+ mkStrictTVar :: (a -> Maybe String ) -> Lazy. TVar m a -> StrictTVar m a
239
+
249
240
-- | Check invariant (if enabled) before continuing
250
241
--
251
242
-- @checkInvariant mErr x@ is equal to @x@ if @mErr == Nothing@, and throws
@@ -255,9 +246,16 @@ isEmptyTMVar (StrictTMVar tmvar) = Lazy.isEmptyTMVar tmvar
255
246
-- invariants can reuse the same logic, rather than having to introduce new
256
247
-- per-package flags.
257
248
checkInvariant :: HasCallStack => Maybe String -> a -> a
249
+
258
250
#if CHECK_TVAR_INVARIANT
259
- checkInvariant Nothing k = k
260
- checkInvariant (Just err) _ = error $ " Invariant violation: " ++ err
251
+ getInvariant StrictTVar {invariant} = invariant
252
+ mkStrictTVar invariant tvar = StrictTVar {invariant, tvar}
253
+
254
+ checkInvariant Nothing k = k
255
+ checkInvariant (Just err) _ = error $ " Invariant violation: " ++ err
261
256
#else
262
- checkInvariant _err k = k
257
+ getInvariant _ = \ _ -> Nothing
258
+ mkStrictTVar _invariant tvar = StrictTVar {tvar}
259
+
260
+ checkInvariant _err k = k
263
261
#endif
0 commit comments