-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Fork of the monad-parallel package using monad-control -- -- Fork of the monad-parallel package using monad-control @package classy-parallel @version 0.1.0.0 -- | This module defines classes of monads that can perform multiple -- computations in parallel and, more importantly, combine the results of -- those parallel computations. -- -- There are two classes exported by this module, Parallel and -- Fork. The former is more generic, but the latter is easier to -- use: when invoking any expensive computation that could be performed -- in parallel, simply wrap the call in forkExec. The function -- immediately returns a handle to the running computation. The handle -- can be used to obtain the result of the computation when needed: -- --
-- do child <- forkExec expensive -- otherStuff -- result <- child ---- -- In this example, the computations expensive and -- otherStuff would be performed in parallel. When using the -- Parallel class, both parallel computations must be specified at -- once: -- --
-- bindM2 (\ childResult otherResult -> ...) expensive otherStuff ---- -- In either case, for best results the costs of the two computations -- should be roughly equal. -- -- Any monad that is an instance of the Fork class can also be -- instance of the Parallel class by the following rule: -- --
-- bindM2 f ma mb = do {a' <- forkExec ma; b <- mb; a <- a'; f a b}
--
--
-- When operating with monads free of side-effects, such as
-- Identity or Maybe, forkExec is equivalent to
-- return and bindM2 is equivalent to \ f ma mb ->
-- do {a <- ma; b <- mb; f a b} — the only difference is in
-- the resource utilisation. With the IO monad, on the other hand,
-- there may be visible difference in the results because the side
-- effects of ma and mb may be arbitrarily reordered.
module Control.Monad.Parallel
-- | Class of types that can perform two computations in parallel and bind
-- their results together.
class Monad m => Parallel m
bindM2 :: Parallel m => (a -> b -> m c) -> m a -> m b -> m c
-- | Class of monads that can fork a parallel computation.
class Monad m => Fork m
forkExec :: Fork m => m a -> m (m a)
-- | Perform three monadic computations in parallel; when they are all
-- finished, pass their results to the function.
bindM3 :: Parallel m => (a -> b -> c -> m d) -> m a -> m b -> m c -> m d
-- | Like liftM2, but evaluating its two monadic arguments in
-- parallel.
liftM2 :: Parallel m => (a -> b -> c) -> m a -> m b -> m c
-- | Like liftM3, but evaluating its three monadic arguments in
-- parallel.
liftM3 :: Parallel m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
-- | Like ap, but evaluating the function and its argument in
-- parallel.
ap :: Parallel m => m (a -> b) -> m a -> m b
-- | Like sequence, but executing the actions in parallel.
sequence :: Parallel m => [m a] -> m [a]
-- | Like sequence_, but executing the actions in parallel.
sequence_ :: Fork m => [m a] -> m ()
-- | Like mapM, but applying the function to the individual list
-- items in parallel.
mapM :: Parallel m => (a -> m b) -> [a] -> m [b]
-- | Like replicateM, but executing the action multiple times in
-- parallel.
replicateM :: Parallel m => Int -> m a -> m [a]
-- | Like replicateM_, but executing the action multiple times in
-- parallel.
replicateM_ :: Fork m => Int -> m a -> m ()
defaultForkExec :: Monad m => m a -> (m (m a))
defaultBindM2 :: Monad m => (a -> b -> m c) -> m a -> m b -> m c
-- | Common bind pattern for monad transformers
bindTrans :: (MonadTransControl t, Parallel m, Monad m, Monad (t m)) => (a -> b -> t m c) -> t m a -> t m b -> t m c
forkTrans :: (MonadTransControl t, Fork m) => t m a -> t m (t m a)
-- | Defines bindM2 in terms of forkExec
parallelIO :: Fork m => (a -> b -> m c) -> m a -> m b -> m c
instance Fork (ResourceT IO)
instance Fork IO
instance Fork ((->) r)
instance Fork []
instance Fork Maybe
instance Parallel m => Parallel (ReaderT r m)
instance Parallel m => Parallel (ListT m)
instance (Parallel m, Error e) => Parallel (ErrorT e m)
instance Parallel m => Parallel (MaybeT m)
instance Parallel m => Parallel (IdentityT m)
instance Parallel (ResourceT IO)
instance Parallel IO
instance Parallel ((->) r)
instance Parallel []
instance Parallel Maybe
instance Parallel Identity