@@ -132,6 +132,7 @@ class ( Monad m
132
132
tryPeekTQueue :: TQueue m a -> STM m (Maybe a )
133
133
writeTQueue :: TQueue m a -> a -> STM m ()
134
134
isEmptyTQueue :: TQueue m a -> STM m Bool
135
+ unGetTQueue :: TQueue m a -> a -> STM m ()
135
136
136
137
type TBQueue m :: Type -> Type
137
138
newTBQueue :: Natural -> STM m (TBQueue m a )
@@ -145,6 +146,7 @@ class ( Monad m
145
146
lengthTBQueue :: TBQueue m a -> STM m Natural
146
147
isEmptyTBQueue :: TBQueue m a -> STM m Bool
147
148
isFullTBQueue :: TBQueue m a -> STM m Bool
149
+ unGetTBQueue :: TBQueue m a -> a -> STM m ()
148
150
149
151
-- Helpful derived functions with default implementations
150
152
@@ -224,6 +226,10 @@ class ( Monad m
224
226
=> TQueue m a -> STM m Bool
225
227
isEmptyTQueue = isEmptyTQueueDefault
226
228
229
+ default unGetTQueue :: TQueue m ~ TQueueDefault m
230
+ => TQueue m a -> a -> STM m ()
231
+ unGetTQueue = unGetTQueueDefault
232
+
227
233
default peekTQueue :: TQueue m ~ TQueueDefault m
228
234
=> TQueue m a -> STM m a
229
235
peekTQueue = peekTQueueDefault
@@ -272,6 +278,10 @@ class ( Monad m
272
278
=> TBQueue m a -> STM m [a]
273
279
flushTBQueue = flushTBQueueDefault
274
280
281
+ default unGetTBQueue :: TBQueue m ~ TBQueueDefault m
282
+ => TBQueue m a -> a -> STM m ()
283
+ unGetTBQueue = unGetTBQueueDefault
284
+
275
285
276
286
stateTVarDefault :: MonadSTM m => TVar m s -> (s -> (a , s )) -> STM m a
277
287
stateTVarDefault var f = do
@@ -530,6 +540,7 @@ instance MonadSTM IO where
530
540
flushTBQueue = STM. flushTBQueue
531
541
writeTQueue = STM. writeTQueue
532
542
isEmptyTQueue = STM. isEmptyTQueue
543
+ unGetTQueue = STM. unGetTQueue
533
544
newTBQueue = STM. newTBQueue
534
545
readTBQueue = STM. readTBQueue
535
546
tryReadTBQueue = STM. tryReadTBQueue
@@ -539,6 +550,7 @@ instance MonadSTM IO where
539
550
lengthTBQueue = STM. lengthTBQueue
540
551
isEmptyTBQueue = STM. isEmptyTBQueue
541
552
isFullTBQueue = STM. isFullTBQueue
553
+ unGetTBQueue = STM. unGetTBQueue
542
554
543
555
newTVarIO = STM. newTVarIO
544
556
readTVarIO = STM. readTVarIO
@@ -758,6 +770,11 @@ tryPeekTQueueDefault (TQueue read _write) = do
758
770
(x: _) -> return (Just x)
759
771
_ -> return Nothing
760
772
773
+ unGetTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
774
+ unGetTQueueDefault (TQueue read _write) a = modifyTVar read (a: )
775
+
776
+
777
+
761
778
--
762
779
-- Default TBQueue implementation in terms of TVars
763
780
--
@@ -879,6 +896,19 @@ flushTBQueueDefault (TBQueue rsize read wsize write size) = do
879
896
writeTVar wsize size
880
897
return (xs ++ reverse ys)
881
898
899
+ unGetTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> a -> STM m ()
900
+ unGetTBQueueDefault (TBQueue rsize read wsize _write _size) a = do
901
+ r <- readTVar rsize
902
+ if (r > 0 )
903
+ then do writeTVar rsize $! r - 1
904
+ else do
905
+ w <- readTVar wsize
906
+ if (w > 0 )
907
+ then writeTVar wsize $! w - 1
908
+ else retry
909
+ xs <- readTVar read
910
+ writeTVar read (a: xs)
911
+
882
912
883
913
-- | 'throwIO' specialised to @stm@ monad.
884
914
--
@@ -976,6 +1006,7 @@ instance MonadSTM m => MonadSTM (ContT r m) where
976
1006
tryPeekTQueue = WrappedSTM . tryPeekTQueue
977
1007
writeTQueue v = WrappedSTM . writeTQueue v
978
1008
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1009
+ unGetTQueue = WrappedSTM .: unGetTQueue
979
1010
980
1011
type TBQueue (ContT r m ) = TBQueue m
981
1012
newTBQueue = WrappedSTM . newTBQueue
@@ -988,6 +1019,7 @@ instance MonadSTM m => MonadSTM (ContT r m) where
988
1019
lengthTBQueue = WrappedSTM . lengthTBQueue
989
1020
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
990
1021
isFullTBQueue = WrappedSTM . isFullTBQueue
1022
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
991
1023
992
1024
993
1025
instance MonadSTM m => MonadSTM (ReaderT r m ) where
@@ -1021,12 +1053,13 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
1021
1053
1022
1054
type TQueue (ReaderT r m ) = TQueue m
1023
1055
newTQueue = WrappedSTM newTQueue
1024
- readTQueue = WrappedSTM . readTQueue
1025
- tryReadTQueue = WrappedSTM . tryReadTQueue
1026
- peekTQueue = WrappedSTM . peekTQueue
1027
- tryPeekTQueue = WrappedSTM . tryPeekTQueue
1028
- writeTQueue v = WrappedSTM . writeTQueue v
1029
- isEmptyTQueue = WrappedSTM . isEmptyTQueue
1056
+ readTQueue = WrappedSTM . readTQueue
1057
+ tryReadTQueue = WrappedSTM . tryReadTQueue
1058
+ peekTQueue = WrappedSTM . peekTQueue
1059
+ tryPeekTQueue = WrappedSTM . tryPeekTQueue
1060
+ writeTQueue v = WrappedSTM . writeTQueue v
1061
+ isEmptyTQueue = WrappedSTM . isEmptyTQueue
1062
+ unGetTQueue = WrappedSTM .: unGetTQueue
1030
1063
1031
1064
type TBQueue (ReaderT r m ) = TBQueue m
1032
1065
newTBQueue = WrappedSTM . newTBQueue
@@ -1039,6 +1072,7 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
1039
1072
lengthTBQueue = WrappedSTM . lengthTBQueue
1040
1073
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
1041
1074
isFullTBQueue = WrappedSTM . isFullTBQueue
1075
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
1042
1076
1043
1077
1044
1078
instance (Monoid w , MonadSTM m ) => MonadSTM (WriterT w m ) where
@@ -1072,12 +1106,13 @@ instance (Monoid w, MonadSTM m) => MonadSTM (WriterT w m) where
1072
1106
1073
1107
type TQueue (WriterT w m ) = TQueue m
1074
1108
newTQueue = WrappedSTM newTQueue
1075
- readTQueue = WrappedSTM . readTQueue
1076
- tryReadTQueue = WrappedSTM . tryReadTQueue
1077
- peekTQueue = WrappedSTM . peekTQueue
1078
- tryPeekTQueue = WrappedSTM . tryPeekTQueue
1079
- writeTQueue v = WrappedSTM . writeTQueue v
1080
- isEmptyTQueue = WrappedSTM . isEmptyTQueue
1109
+ readTQueue = WrappedSTM . readTQueue
1110
+ tryReadTQueue = WrappedSTM . tryReadTQueue
1111
+ peekTQueue = WrappedSTM . peekTQueue
1112
+ tryPeekTQueue = WrappedSTM . tryPeekTQueue
1113
+ writeTQueue v = WrappedSTM . writeTQueue v
1114
+ isEmptyTQueue = WrappedSTM . isEmptyTQueue
1115
+ unGetTQueue = WrappedSTM .: unGetTQueue
1081
1116
1082
1117
type TBQueue (WriterT w m ) = TBQueue m
1083
1118
newTBQueue = WrappedSTM . newTBQueue
@@ -1090,6 +1125,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (WriterT w m) where
1090
1125
lengthTBQueue = WrappedSTM . lengthTBQueue
1091
1126
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
1092
1127
isFullTBQueue = WrappedSTM . isFullTBQueue
1128
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
1093
1129
1094
1130
1095
1131
instance MonadSTM m => MonadSTM (StateT s m ) where
@@ -1129,6 +1165,7 @@ instance MonadSTM m => MonadSTM (StateT s m) where
1129
1165
tryPeekTQueue = WrappedSTM . tryPeekTQueue
1130
1166
writeTQueue v = WrappedSTM . writeTQueue v
1131
1167
isEmptyTQueue = WrappedSTM . isEmptyTQueue
1168
+ unGetTQueue = WrappedSTM .: unGetTQueue
1132
1169
1133
1170
type TBQueue (StateT s m ) = TBQueue m
1134
1171
newTBQueue = WrappedSTM . newTBQueue
@@ -1141,6 +1178,7 @@ instance MonadSTM m => MonadSTM (StateT s m) where
1141
1178
lengthTBQueue = WrappedSTM . lengthTBQueue
1142
1179
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
1143
1180
isFullTBQueue = WrappedSTM . isFullTBQueue
1181
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
1144
1182
1145
1183
1146
1184
instance MonadSTM m => MonadSTM (ExceptT e m ) where
@@ -1174,12 +1212,13 @@ instance MonadSTM m => MonadSTM (ExceptT e m) where
1174
1212
1175
1213
type TQueue (ExceptT e m ) = TQueue m
1176
1214
newTQueue = WrappedSTM newTQueue
1177
- readTQueue = WrappedSTM . readTQueue
1178
- tryReadTQueue = WrappedSTM . tryReadTQueue
1179
- peekTQueue = WrappedSTM . peekTQueue
1180
- tryPeekTQueue = WrappedSTM . tryPeekTQueue
1181
- writeTQueue v = WrappedSTM . writeTQueue v
1182
- isEmptyTQueue = WrappedSTM . isEmptyTQueue
1215
+ readTQueue = WrappedSTM . readTQueue
1216
+ tryReadTQueue = WrappedSTM . tryReadTQueue
1217
+ peekTQueue = WrappedSTM . peekTQueue
1218
+ tryPeekTQueue = WrappedSTM . tryPeekTQueue
1219
+ writeTQueue v = WrappedSTM . writeTQueue v
1220
+ isEmptyTQueue = WrappedSTM . isEmptyTQueue
1221
+ unGetTQueue = WrappedSTM .: unGetTQueue
1183
1222
1184
1223
type TBQueue (ExceptT e m ) = TBQueue m
1185
1224
newTBQueue = WrappedSTM . newTBQueue
@@ -1192,6 +1231,7 @@ instance MonadSTM m => MonadSTM (ExceptT e m) where
1192
1231
lengthTBQueue = WrappedSTM . lengthTBQueue
1193
1232
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
1194
1233
isFullTBQueue = WrappedSTM . isFullTBQueue
1234
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
1195
1235
1196
1236
1197
1237
instance (Monoid w , MonadSTM m ) => MonadSTM (RWST r w s m ) where
@@ -1225,12 +1265,13 @@ instance (Monoid w, MonadSTM m) => MonadSTM (RWST r w s m) where
1225
1265
1226
1266
type TQueue (RWST r w s m ) = TQueue m
1227
1267
newTQueue = WrappedSTM newTQueue
1228
- readTQueue = WrappedSTM . readTQueue
1229
- tryReadTQueue = WrappedSTM . tryReadTQueue
1230
- peekTQueue = WrappedSTM . peekTQueue
1231
- tryPeekTQueue = WrappedSTM . tryPeekTQueue
1232
- writeTQueue v = WrappedSTM . writeTQueue v
1233
- isEmptyTQueue = WrappedSTM . isEmptyTQueue
1268
+ readTQueue = WrappedSTM . readTQueue
1269
+ tryReadTQueue = WrappedSTM . tryReadTQueue
1270
+ peekTQueue = WrappedSTM . peekTQueue
1271
+ tryPeekTQueue = WrappedSTM . tryPeekTQueue
1272
+ writeTQueue v = WrappedSTM . writeTQueue v
1273
+ isEmptyTQueue = WrappedSTM . isEmptyTQueue
1274
+ unGetTQueue = WrappedSTM .: unGetTQueue
1234
1275
1235
1276
type TBQueue (RWST r w s m ) = TBQueue m
1236
1277
newTBQueue = WrappedSTM . newTBQueue
@@ -1243,6 +1284,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (RWST r w s m) where
1243
1284
lengthTBQueue = WrappedSTM . lengthTBQueue
1244
1285
isEmptyTBQueue = WrappedSTM . isEmptyTBQueue
1245
1286
isFullTBQueue = WrappedSTM . isFullTBQueue
1287
+ unGetTBQueue = WrappedSTM .: unGetTBQueue
1246
1288
1247
1289
1248
1290
(.:) :: (c -> d ) -> (a -> b -> c ) -> (a -> b -> d )
0 commit comments