packages feed

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