|
Packit |
1d883e |
{-# LANGUAGE CPP, NoImplicitPrelude, FlexibleContexts #-}
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
#if __GLASGOW_HASKELL__ >= 702
|
|
Packit |
1d883e |
{-# LANGUAGE Safe #-}
|
|
Packit |
1d883e |
#endif
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- |
|
|
Packit |
1d883e |
-- Module : System.Timeout.Lifted
|
|
Packit |
1d883e |
-- Copyright : (c) The University of Glasgow 2007
|
|
Packit |
1d883e |
-- License : BSD-style (see the file libraries/base/LICENSE)
|
|
Packit |
1d883e |
--
|
|
Packit |
1d883e |
-- Maintainer : libraries@haskell.org
|
|
Packit |
1d883e |
-- Stability : experimental
|
|
Packit |
1d883e |
-- Portability : non-portable
|
|
Packit |
1d883e |
--
|
|
Packit |
1d883e |
-- Attach a timeout event to monadic computations
|
|
Packit |
1d883e |
-- which are instances of 'MonadBaseControl'.
|
|
Packit |
1d883e |
--
|
|
Packit |
1d883e |
-------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
module System.Timeout.Lifted ( timeout ) where
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from base:
|
|
Packit |
1d883e |
import Prelude ( (.) )
|
|
Packit |
1d883e |
import Data.Int ( Int )
|
|
Packit |
1d883e |
import Data.Maybe ( Maybe(Nothing, Just), maybe )
|
|
Packit |
1d883e |
import Control.Monad ( (>>=), return, liftM )
|
|
Packit |
1d883e |
import System.IO ( IO )
|
|
Packit |
1d883e |
import qualified System.Timeout as T ( timeout )
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from monad-control:
|
|
Packit |
1d883e |
import Control.Monad.Trans.Control ( MonadBaseControl, restoreM, liftBaseWith )
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
#include "inlinable.h"
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- | Generalized version of 'T.timeout'.
|
|
Packit |
1d883e |
--
|
|
Packit |
1d883e |
-- Note that when the given computation times out any side effects of @m@ are
|
|
Packit |
1d883e |
-- discarded. When the computation completes within the given time the
|
|
Packit |
1d883e |
-- side-effects are restored on return.
|
|
Packit |
1d883e |
timeout :: MonadBaseControl IO m => Int -> m a -> m (Maybe a)
|
|
Packit |
1d883e |
timeout t m = liftBaseWith (\runInIO -> T.timeout t (runInIO m)) >>=
|
|
Packit |
1d883e |
maybe (return Nothing) (liftM Just . restoreM)
|
|
Packit |
1d883e |
{-# INLINABLE timeout #-}
|