module Control.Monad.MultiPass.Instrument.CreateST2Array
( CreateST2Array
, createST2Array, pmapST2ArrayMP
)
where
import Control.Monad.ST2
import Control.Monad.MultiPass
import Data.Ix
data CreateST2Array r w p1 tc
= CreateST2Array
{ createInternal :: !(
forall i a.
(Ix i, Num i) =>
NumThreads ->
(i,i) ->
(i -> MultiPass r w tc (p1 a)) ->
MultiPass r w tc (p1 (ST2Array r w i a)))
}
createST2Array
:: (Ix i, Num i, Monad p1)
=> CreateST2Array r w p1 tc
-> NumThreads
-> (i,i)
-> (i -> MultiPass r w tc (p1 a))
-> MultiPass r w tc (p1 (ST2Array r w i a))
createST2Array =
createInternal
instance Instrument tc () () (CreateST2Array r w Off tc) where
createInstrument _ _ () =
wrapInstrument $ CreateST2Array $ \m n f ->
do parallelMP_ m n f
return Off
instance Instrument tc () () (CreateST2Array r w On tc) where
createInstrument _ _ () =
wrapInstrument $ CreateST2Array $ \m n f ->
let f' i =
do On x <- f i
return x
in
do xs <- parallelMP m n f'
return (On xs)
pmapST2ArrayMP
:: (Ix i, Num i, Monad p1)
=> CreateST2Array r w p1 tc
-> NumThreads
-> ST2Array r w i a
-> (a -> MultiPass r w tc (p1 b))
-> MultiPass r w tc (p1 (ST2Array r w i b))
pmapST2ArrayMP cr nThreads xs f =
let f' i =
do x <- readOnlyST2ToMP $ readST2Array xs i
f x
in
do bnds <- readOnlyST2ToMP $ boundsST2Array xs
createST2Array cr nThreads bnds f'