module Control.Monad.MultiPass.Example.OrdCons ( convertArray )
where
import Control.Monad.ST2
import Control.Monad.MultiPass
import Control.Monad.MultiPass.Instrument.CreateST2Array
import Control.Monad.MultiPass.Instrument.OrdCons
import Data.Ix
newtype ConvertArray i a r w p1 p2 tc
= ConvertArray (ConvertArrayType i a r w p1 p2 tc)
type ConvertArrayType i a r w p1 p2 tc
= OrdCons a r w p1 p2 tc
-> CreateST2Array r w p2 tc
-> MultiPassMain r w tc (p2 (ST2Array r w i Int))
instance MultiPassAlgorithm
(ConvertArray i a r w p1 p2 tc)
(ConvertArrayType i a r w p1 p2 tc)
where
unwrapMultiPassAlgorithm (ConvertArray f) = f
convertArray
:: (Ix i, Num i, Ord a)
=> NumThreads
-> ST2Array r w i a
-> ST2 r w (ST2Array r w i Int)
convertArray n xs =
run $ PassS $ PassS $ PassZ $ ConvertArray $
convertArrayMP n xs
convertArrayMP
:: (Ix i, Num i, Ord a, Monad p1, Monad p2)
=> NumThreads
-> ST2Array r w i a
-> ConvertArrayType i a r w p1 p2 tc
convertArrayMP n xs oc cr =
mkMultiPassMain
(return ())
(\() ->
pmapST2ArrayMP cr n xs $ \x ->
ordCons oc (return x))
return