{-# LANGUAGE NoMonomorphismRestriction, ImplicitParams, FlexibleContexts, Trustworthy #-} -- | Compatibility shims for old version module Control.CUtils.Conc (concF_, conc_, conc, module Control.CUtils.AssociativeFolding) where import Data.Array.IO import Data.Array import Data.Array.Unsafe import System.IO.Unsafe import Control.CUtils.CPUMultiThreading import Control.CUtils.AssociativeFolding concF_ = let pool = ?pool in throwToCallerAdapter_ pool(concurrent_ pool) partConc_ f mnds = concF_(rangeSize (bounds mnds)) $ f . (+ fst (bounds mnds)) conc_ mnds = partConc_(mnds !) mnds unsafeFreeze' :: IOArray Int e -> IO (Array Int e) unsafeFreeze' = unsafeFreeze partConcF bnds f mnds = do res <- unsafeInterleaveIO(newArray_ bnds) f (\i -> do x <- mnds i writeArray res i x) unsafeFreeze' res -- | Runs several computations concurrently, and returns their results as an array. Waits for all threads to end before returning. conc mnds = partConcF(bounds mnds) (`partConc_` mnds) (mnds !)