rfc-0.0.0.1: src/RFC/Concurrent.hs
module RFC.Concurrent
( module RFC.Concurrent
, module Control.Concurrent.Async.Lifted
) where
import RFC.Prelude hiding (mapConcurrently)
import Control.Concurrent.Async.Lifted (mapConcurrently, mapConcurrently_)
-- |Executes all the IO actions simultaneously and returns the original data structure with the arguments replaced
-- by the results of the execution.
doConcurrently :: (Traversable t, MonadBaseControl IO m) => t (m a) -> m (t a)
doConcurrently = mapConcurrently id
-- |Executes all the IO actions simulataneously and discards the results.
doConcurrently_ :: (Foldable f, MonadBaseControl IO m) => f (m a) -> m ()
doConcurrently_ = mapConcurrently_ id
-- |Executes all the IO actions simultaneously, feeds them into the filter function, and then
-- filters the results.
filterConcurrently :: (MonadBaseControl IO m) => (a -> Bool) -> [m a] -> m [a] -- TODO Seems like we should be able to do this with Foldable/Traversable
filterConcurrently filterFunc actions =
filter filterFunc <$> doConcurrently actions