Blame System/Timeout/Lifted.hs

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 #-}