Repository : ssh://darcs.haskell.org//srv/darcs/packages/parallel

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/7f0db70d5b4a7b4d12bfba5e619328cb31c1424b

>---------------------------------------------------------------

commit 7f0db70d5b4a7b4d12bfba5e619328cb31c1424b
Author: Simon Marlow <[email protected]>
Date:   Fri Sep 30 11:40:21 2011 +0100

    add rparWith, and use it instead of rpar `dot` s

>---------------------------------------------------------------

 Control/Parallel/Strategies.hs |   47 ++++++++++++++++++++++++++++------------
 1 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/Control/Parallel/Strategies.hs b/Control/Parallel/Strategies.hs
index 14b0c9d..5a148bf 100644
--- a/Control/Parallel/Strategies.hs
+++ b/Control/Parallel/Strategies.hs
@@ -50,6 +50,7 @@ module Control.Parallel.Strategies (
        , rseq
        , rdeepseq          -- :: NFData a => Strategy a
        , rpar              -- :: Strategy a
+       , rparWith          -- :: Strategy a -> Strategy a
 
          -- * Injection of sequential strategies
        , evalSeq           -- :: Seq.Strategy a -> Strategy a
@@ -356,6 +357,24 @@ rpar :: a -> Eval a
 rpar  x = Eval $ \s -> spark# x s
 {-# INLINE rpar  #-}
 
+-- | instead of saying @rpar `dot` strat@, you can say
+-- @rparWith strat@.  Compared to 'rpar', 'rparWith'
+--
+--  * does not exit the `Eval` monad
+--
+--  * does not have a built-in `rseq`, so for example `rparWith r0`
+--    behaves as you might expect (it is a strategy that creates a
+--    spark that does no evaluation).
+--
+--
+rparWith :: Strategy a -> Strategy a
+rparWith s a = do l <- rpar r; return (case l of Lift x -> x)
+  where r = case s a of
+              Eval f -> case f realWorld# of
+                          (# _, a' #) -> Lift a'
+
+data Lift a = Lift a
+
 -- --------------------------------------------------------------------------
 -- Strategy combinators for Traversable data types
 
@@ -367,7 +386,7 @@ evalTraversable = traverse
 
 -- | Like 'evalTraversable' but evaluates all elements in parallel.
 parTraversable :: Traversable t => Strategy a -> Strategy (t a)
-parTraversable strat = evalTraversable (rpar `dot` strat)
+parTraversable strat = evalTraversable (rparWith strat)
 {-# INLINE parTraversable #-}
 
 -- --------------------------------------------------------------------------
@@ -388,7 +407,7 @@ evalList = evalTraversable
 parList :: Strategy a -> Strategy [a]
 parList = parTraversable
 -- Alternative definition via evalList:
--- parList strat = evalList (rpar `dot` strat)
+-- parList strat = evalList (rparWith strat)
 
 -- | @'evaListSplitAt' n stratPref stratSuff@ evaluates the prefix
 -- (of length @n@) of a list according to @stratPref@ and its the suffix
@@ -402,7 +421,7 @@ evalListSplitAt n stratPref stratSuff xs
 
 -- | Like 'evalListSplitAt' but evaluates both sublists in parallel.
 parListSplitAt :: Int -> Strategy [a] -> Strategy [a] -> Strategy [a]
-parListSplitAt n stratPref stratSuff = evalListSplitAt n (rpar `dot` 
stratPref) (rpar `dot` stratSuff)
+parListSplitAt n stratPref stratSuff = evalListSplitAt n (rparWith stratPref) 
(rparWith stratSuff)
 
 -- | Evaluate the first n elements of a list according to the given strategy.
 evalListN :: Int -> Strategy a -> Strategy [a]
@@ -410,7 +429,7 @@ evalListN n strat = evalListSplitAt n (evalList strat) r0
 
 -- | Like 'evalListN' but evaluates the first n elements in parallel.
 parListN :: Int -> Strategy a -> Strategy [a]
-parListN n strat = evalListN n (rpar `dot` strat)
+parListN n strat = evalListN n (rparWith strat)
 
 -- | Evaluate the nth element of a list (if there is such) according to
 -- the given strategy.
@@ -420,7 +439,7 @@ evalListNth n strat = evalListSplitAt n r0 (evalListN 1 
strat)
 
 -- | Like 'evalListN' but evaluates the nth element in parallel.
 parListNth :: Int -> Strategy a -> Strategy [a]
-parListNth n strat = evalListNth n (rpar `dot` strat)
+parListNth n strat = evalListNth n (rparWith strat)
 
 -- | Divides a list into chunks, and applies the strategy
 -- @'evalList' strat@ to each chunk in parallel.
@@ -516,7 +535,7 @@ parBufferWHNF n0 xs0 = return (ret xs0 (start n0 xs0))
 parBuffer :: Int -> Strategy a -> Strategy [a]
 parBuffer n strat = parBufferWHNF n . map (withStrategy strat)
 -- Alternative definition via evalBuffer (may compromise firing of RULES):
--- parBuffer n strat = evalBuffer n (rpar `dot` strat)
+-- parBuffer n strat = evalBuffer n (rparWith strat)
 
 -- Deforest the intermediate list in parBuffer/evalBuffer when it is
 -- unnecessary:
@@ -563,35 +582,35 @@ evalTuple9 strat1 strat2 strat3 strat4 strat5 strat6 
strat7 strat8 strat9 (x1,x2
 
 parTuple2 :: Strategy a -> Strategy b -> Strategy (a,b)
 parTuple2 strat1 strat2 =
-  evalTuple2 (rpar `dot` strat1) (rpar `dot` strat2)
+  evalTuple2 (rparWith strat1) (rparWith strat2)
 
 parTuple3 :: Strategy a -> Strategy b -> Strategy c -> Strategy (a,b,c)
 parTuple3 strat1 strat2 strat3 =
-  evalTuple3 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3)
+  evalTuple3 (rparWith strat1) (rparWith strat2) (rparWith strat3)
 
 parTuple4 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
(a,b,c,d)
 parTuple4 strat1 strat2 strat3 strat4 =
-  evalTuple4 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4)
+  evalTuple4 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4)
 
 parTuple5 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
e -> Strategy (a,b,c,d,e)
 parTuple5 strat1 strat2 strat3 strat4 strat5 =
-  evalTuple5 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4) (rpar `dot` strat5)
+  evalTuple5 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4) (rparWith strat5)
 
 parTuple6 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
e -> Strategy f -> Strategy (a,b,c,d,e,f)
 parTuple6 strat1 strat2 strat3 strat4 strat5 strat6 =
-  evalTuple6 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4) (rpar `dot` strat5) (rpar `dot` strat6)
+  evalTuple6 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4) (rparWith strat5) (rparWith strat6)
 
 parTuple7 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
e -> Strategy f -> Strategy g -> Strategy (a,b,c,d,e,f,g)
 parTuple7 strat1 strat2 strat3 strat4 strat5 strat6 strat7 =
-  evalTuple7 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4) (rpar `dot` strat5) (rpar `dot` strat6) (rpar `dot` strat7)
+  evalTuple7 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4) (rparWith strat5) (rparWith strat6) (rparWith strat7)
 
 parTuple8 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
e -> Strategy f -> Strategy g -> Strategy h -> Strategy (a,b,c,d,e,f,g,h)
 parTuple8 strat1 strat2 strat3 strat4 strat5 strat6 strat7 strat8 =
-  evalTuple8 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4) (rpar `dot` strat5) (rpar `dot` strat6) (rpar `dot` strat7) (rpar 
`dot` strat8)
+  evalTuple8 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4) (rparWith strat5) (rparWith strat6) (rparWith strat7) (rparWith strat8)
 
 parTuple9 :: Strategy a -> Strategy b -> Strategy c -> Strategy d -> Strategy 
e -> Strategy f -> Strategy g -> Strategy h -> Strategy i -> Strategy 
(a,b,c,d,e,f,g,h,i)
 parTuple9 strat1 strat2 strat3 strat4 strat5 strat6 strat7 strat8 strat9 =
-  evalTuple9 (rpar `dot` strat1) (rpar `dot` strat2) (rpar `dot` strat3) (rpar 
`dot` strat4) (rpar `dot` strat5) (rpar `dot` strat6) (rpar `dot` strat7) (rpar 
`dot` strat8) (rpar `dot` strat9)
+  evalTuple9 (rparWith strat1) (rparWith strat2) (rparWith strat3) (rparWith 
strat4) (rparWith strat5) (rparWith strat6) (rparWith strat7) (rparWith strat8) 
(rparWith strat9)
 
 -- --------------------------------------------------------------------------
 -- Strategic function application



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to