Skip to content

Commit 80eca9e

Browse files
committed
io-classes: MonadTimer instances for monad transformers
* ReaderT * WriterT * StateT * RWST
1 parent cd18c3b commit 80eca9e

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

io-classes/src/Control/Monad/Class/MonadTimer.hs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,53 @@ instance MonadDelay m => MonadDelay (ExceptT e m) where
255255
threadDelay = lift . threadDelay
256256
instance (Monoid w, MonadDelay m) => MonadDelay (RWST r w s m) where
257257
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

Comments
 (0)