eprocess 1.1.2 → 1.5.0
raw patch · 2 files changed
+26/−4 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Control.Concurrent.Process: instance (Monad m) => Monad (ReceiverT r m)
- Control.Concurrent.Process: instance (MonadCatchIO m) => MonadCatchIO (ReceiverT r m)
- Control.Concurrent.Process: instance (MonadError e m) => MonadError e (ReceiverT r m)
- Control.Concurrent.Process: instance (MonadIO m) => MonadIO (ReceiverT r m)
- Control.Concurrent.Process: instance (MonadReader r m) => MonadReader r (ReceiverT r m)
- Control.Concurrent.Process: instance (MonadState s m) => MonadState s (ReceiverT r m)
+ Control.Concurrent.Process: instance Monad m => Monad (ReceiverT r m)
+ Control.Concurrent.Process: instance MonadCatchIO m => MonadCatchIO (ReceiverT r m)
+ Control.Concurrent.Process: instance MonadError e m => MonadError e (ReceiverT r m)
+ Control.Concurrent.Process: instance MonadIO m => MonadIO (ReceiverT r m)
+ Control.Concurrent.Process: instance MonadReader r m => MonadReader r (ReceiverT r m)
+ Control.Concurrent.Process: instance MonadState s m => MonadState s (ReceiverT r m)
+ Control.Concurrent.Process: recvIn :: MonadIO m => Int -> ReceiverT r m (Maybe r)
- Control.Concurrent.Process: kill :: (MonadIO m) => Handle a -> m ()
+ Control.Concurrent.Process: kill :: MonadIO m => Handle a -> m ()
- Control.Concurrent.Process: recv :: (MonadIO m) => ReceiverT r m r
+ Control.Concurrent.Process: recv :: MonadIO m => ReceiverT r m r
- Control.Concurrent.Process: runHere :: (MonadIO m) => Process r t -> m t
+ Control.Concurrent.Process: runHere :: MonadIO m => Process r t -> m t
- Control.Concurrent.Process: self :: (Monad m) => ReceiverT r m (Handle r)
+ Control.Concurrent.Process: self :: Monad m => ReceiverT r m (Handle r)
- Control.Concurrent.Process: sendRecv :: (MonadIO m) => Handle a -> a -> ReceiverT r m r
+ Control.Concurrent.Process: sendRecv :: MonadIO m => Handle a -> a -> ReceiverT r m r
- Control.Concurrent.Process: sendTo :: (MonadIO m) => Handle a -> a -> m ()
+ Control.Concurrent.Process: sendTo :: MonadIO m => Handle a -> a -> m ()
- Control.Concurrent.Process: spawn :: (MonadIO m) => Process r k -> m (Handle r)
+ Control.Concurrent.Process: spawn :: MonadIO m => Process r k -> m (Handle r)
Files
- eprocess.cabal +1/−1
- src/Control/Concurrent/Process.hs +25/−3
eprocess.cabal view
@@ -1,5 +1,5 @@ name: eprocess-version: 1.1.2+version: 1.5.0 cabal-version: >=1.6 build-type: Simple license: BSD3
src/Control/Concurrent/Process.hs view
@@ -12,7 +12,7 @@ -- ** Process creation / destruction makeProcess, runHere, spawn, kill, -- ** Message passing- self, sendTo, recv, sendRecv+ self, sendTo, recv, recvIn, sendRecv ) where import Control.Monad.Reader@@ -22,7 +22,6 @@ import Control.Monad.CatchIO import Data.Monoid import Control.Concurrent-import Control.Concurrent.Chan -- | A Process handle. It's returned on process creation and should be used -- | afterwards to send messages to it@@ -66,6 +65,29 @@ recv :: MonadIO m => ReceiverT r m r recv = RT $ ask >>= liftIO . readChan . chan +-- | Just like /recv/ but with a timeout parameter. Usage:+-- @+-- maybeMessage <- recv+-- @+recvIn :: MonadIO m => Int -- ^ milliseconds to wait until timeout+ -> ReceiverT r m (Maybe r)+recvIn ms = RT $+ do+ ch <- ask >>= return . chan+ liftIO $ do+ tmp <- newEmptyMVar+ timer <- if ms > 0+ then forkIO $ do+ let its = [1..10] :: [Int]+ forM_ its $ \_ -> threadDelay $ ms * 100+ putMVar tmp Nothing+ else forkIO $ putMVar tmp Nothing+ runner <- forkIO $ readChan ch >>= putMVar tmp . Just+ res <- takeMVar tmp+ killThread timer+ killThread runner+ return res+ -- | /sendRecv/ is just a syntactic sugar for: -- @ -- sendTo h a >> recv@@ -85,7 +107,7 @@ pChan <- newChan pThread <- forkIO $ do t <- myThreadId- runReaderT (internalReader p) $ PH pChan t+ _ <- runReaderT (internalReader p) $ PH pChan t return () return $ PH pChan pThread