monad-parallel 0.7 → 0.7.1
raw patch · 2 files changed
+11/−10 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Control.Monad.Parallel: class MonadParallel m => MonadFork m
+ Control.Monad.Parallel: class MonadParallel m => MonadFork m where forkExec e = let result = e >>= return in result `par` (return result)
- Control.Monad.Parallel: class Monad m => MonadParallel m
+ Control.Monad.Parallel: class Monad m => MonadParallel m where bindM2 f ma mb = let ma' = ma >>= return mb' = mb >>= return in ma' `par` (mb' `pseq` do { a <- ma'; b <- mb'; f a b })
Files
- Control/Monad/Parallel.hs +9/−8
- monad-parallel.cabal +2/−2
Control/Monad/Parallel.hs view
@@ -61,7 +61,8 @@ import Prelude () import Control.Concurrent (forkIO)-import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, readMVar)+import Control.Exception (SomeException, throwIO, mask, try) import Control.Monad (Monad, (>>=), return, liftM) import Control.Monad.Trans.Identity (IdentityT(IdentityT, runIdentityT)) import Control.Monad.Trans.Maybe (MaybeT(MaybeT, runMaybeT))@@ -69,7 +70,7 @@ import Control.Monad.Trans.List (ListT(ListT, runListT)) import Control.Monad.Trans.Reader (ReaderT(ReaderT, runReaderT)) import Control.Parallel (par, pseq)-import Data.Either (Either(..))+import Data.Either (Either(..), either) import Data.Function (($), (.), const) import Data.Functor.Identity (Identity) import Data.Int (Int)@@ -144,10 +145,9 @@ -- | IO is parallelizable by `forkIO`. instance MonadParallel IO where- bindM2 f ma mb = do vb <- newEmptyMVar- _ <- forkIO (mb >>= putMVar vb)+ bindM2 f ma mb = do waitForB <- forkExec mb a <- ma- b <- takeMVar vb+ b <- waitForB f a b instance MonadParallel m => MonadParallel (IdentityT m) where@@ -183,9 +183,10 @@ -- | IO is forkable by `forkIO`. instance MonadFork IO where- forkExec ma = do v <- newEmptyMVar- _ <- forkIO (ma >>= putMVar v)- return (takeMVar v)+ forkExec ma = do+ v <- newEmptyMVar+ _ <- mask $ \restore -> forkIO $ try (restore ma) >>= putMVar v+ return $ readMVar v >>= either (\e -> throwIO (e :: SomeException)) return instance MonadFork m => MonadFork (IdentityT m) where forkExec ma = IdentityT (liftM IdentityT $ forkExec (runIdentityT ma))
monad-parallel.cabal view
@@ -1,5 +1,5 @@ Name: monad-parallel-Version: 0.7+Version: 0.7.1 Cabal-Version: >= 1.2 Build-Type: Simple Synopsis: Parallel execution of monadic computations@@ -12,7 +12,7 @@ License: GPL License-file: LICENSE.txt-Copyright: (c) 2010 Mario Blazevic+Copyright: (c) 2010-2011 Mario Blazevic Author: Mario Blazevic Maintainer: blamario@yahoo.com Homepage: http://trac.haskell.org/SCC/wiki/monad-parallel