@@ -255,3 +255,53 @@ instance MonadDelay m => MonadDelay (ExceptT e m) where
255
255
threadDelay = lift . threadDelay
256
256
instance (Monoid w , MonadDelay m ) => MonadDelay (RWST r w s m ) where
257
257
threadDelay = lift . threadDelay
258
+
259
+ instance MonadTimer m => MonadTimer (ReaderT r m ) where
260
+ newtype Timeout (ReaderT r m ) = TimeoutR { unTimeoutR :: Timeout m }
261
+ newTimeout = lift . fmap TimeoutR . newTimeout
262
+ readTimeout = WrappedSTM . readTimeout . unTimeoutR
263
+ updateTimeout (TimeoutR t) d = lift $ updateTimeout t d
264
+ cancelTimeout = lift . cancelTimeout . unTimeoutR
265
+ registerDelay = lift . registerDelay
266
+ timeout d f = ReaderT $ \ r -> timeout d (runReaderT f r)
267
+
268
+ instance (Monoid w , MonadTimer m ) => MonadTimer (WriterT w m ) where
269
+ newtype Timeout (WriterT w m ) = TimeoutW { unTimeoutW :: Timeout m }
270
+ newTimeout = lift . fmap TimeoutW . newTimeout
271
+ readTimeout = WrappedSTM . readTimeout . unTimeoutW
272
+ updateTimeout (TimeoutW t) d = lift $ updateTimeout t d
273
+ cancelTimeout = lift . cancelTimeout . unTimeoutW
274
+ registerDelay = lift . registerDelay
275
+ timeout d f = WriterT $ do
276
+ r <- timeout d (runWriterT f)
277
+ return $ case r of
278
+ Nothing -> (Nothing , mempty )
279
+ Just (a, w) -> (Just a, w)
280
+
281
+ instance MonadTimer m => MonadTimer (StateT s m ) where
282
+ newtype Timeout (StateT s m ) = TimeoutS { unTimeoutS :: Timeout m }
283
+ newTimeout = lift . fmap TimeoutS . newTimeout
284
+ readTimeout = WrappedSTM . readTimeout . unTimeoutS
285
+ updateTimeout (TimeoutS t) d = lift $ updateTimeout t d
286
+ cancelTimeout = lift . cancelTimeout . unTimeoutS
287
+ registerDelay = lift . registerDelay
288
+ timeout d f = StateT $ \ s -> do
289
+ r <- timeout d (runStateT f s)
290
+ return $ case r of
291
+ Nothing -> (Nothing , s)
292
+ Just (a, s') -> (Just a, s')
293
+
294
+ instance (Monoid w , MonadTimer m ) => MonadTimer (RWST r w s m ) where
295
+ newtype Timeout (RWST r w s m ) = TimeoutRWS { unTimeoutRWS :: Timeout m }
296
+ newTimeout = lift . fmap TimeoutRWS . newTimeout
297
+ readTimeout = WrappedSTM . readTimeout . unTimeoutRWS
298
+ updateTimeout (TimeoutRWS t) d = lift $ updateTimeout t d
299
+ cancelTimeout = lift . cancelTimeout . unTimeoutRWS
300
+ registerDelay = lift . registerDelay
301
+ timeout d (RWST f) = RWST $ \ r s -> do
302
+ res <- timeout d (f r s)
303
+ return $ case res of
304
+ Nothing -> (Nothing , s, mempty )
305
+ Just (a, s', w) -> (Just a, s', w)
306
+
307
+
0 commit comments