module Parallel where
import Control.Concurrent.MVar
import Control.Concurrent
(<$>) :: (a -> IO b) -> MVar a -> IO (MVar b)
f <$> x
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do xx <- readMVar x
result <- f xx
putMVar v result
base :: a -> IO (MVar a)
base = pure . return
pure :: IO a -> IO (MVar a)
pure x
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do result <- x
putMVar v result
liftList :: ([a] -> IO b) -> [MVar a] -> IO (MVar b)
liftList f x
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do xx <- mapM readMVar x
result <- f xx
putMVar v result
liftList2 :: ([a] -> IO b) -> MVar [MVar a] -> IO (MVar b)
liftList2 f x
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do xxx <- readMVar x
xx <- mapM readMVar xxx
result <- f xx
putMVar v result
liftA :: (a -> IO b) -> MVar a -> IO (MVar b)
liftA f x = f <$> x
liftA2 :: (a -> b -> IO c) -> MVar a -> MVar b -> IO (MVar c)
liftA2 f x y
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do xx <- readMVar x
yy <- readMVar y
result <- f xx yy
putMVar v result
liftA3 ::
(a -> b -> c -> IO d) -> MVar a -> MVar b -> MVar c -> IO (MVar d)
liftA3 f x y z
= do var <- newEmptyMVar
_ <- forkOS (go var)
return var
where go v
= do xx <- readMVar x
yy <- readMVar y
zz <- readMVar z
result <- f xx yy zz
putMVar v result