{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Control.Concurrent.Async.Lifted
(
A.Async
, async, asyncBound, asyncOn
, asyncWithUnmask, asyncOnWithUnmask
, withAsync, withAsyncBound, withAsyncOn
, withAsyncWithUnmask, withAsyncOnWithUnmask
, wait, poll, waitCatch
, cancel
, uninterruptibleCancel
, cancelWith
, A.asyncThreadId
, A.AsyncCancelled(..)
, A.waitSTM, A.pollSTM, A.waitCatchSTM
, waitAny, waitAnyCatch, waitAnyCancel, waitAnyCatchCancel
, waitEither, waitEitherCatch, waitEitherCancel, waitEitherCatchCancel
, waitEither_
, waitBoth
, A.waitAnySTM
, A.waitAnyCatchSTM
, A.waitEitherSTM
, A.waitEitherCatchSTM
, A.waitEitherSTM_
, A.waitBothSTM
, link, link2
, A.ExceptionInLinkedThread(..)
, race, race_, concurrently, concurrently_
, mapConcurrently, mapConcurrently_
, forConcurrently, forConcurrently_
, replicateConcurrently, replicateConcurrently_
, Concurrently(..)
, A.compareAsyncs
) where
import Control.Applicative
import Control.Concurrent (threadDelay)
import Control.Monad ((>=>), forever, void)
import Data.Foldable (fold)
import GHC.IO (unsafeUnmask)
import Prelude
import Control.Concurrent.Async (Async)
import Control.Exception.Lifted (SomeException, Exception)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.Trans.Control
import qualified Control.Concurrent.Async as A
import qualified Control.Exception.Lifted as E
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 710
import Data.Foldable
import Data.Traversable
#endif
#if !MIN_VERSION_base(4, 8, 0)
import Data.Monoid (Monoid(mappend, mempty))
#elif MIN_VERSION_base(4, 9, 0) && !MIN_VERSION_base(4, 13, 0)
import Data.Semigroup (Semigroup((<>)))
#endif
async :: MonadBaseControl IO m => m a -> m (Async (StM m a))
async :: m a -> m (Async (StM m a))
async = (IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing IO (StM m a) -> IO (Async (StM m a))
forall a. IO a -> IO (Async a)
A.async
asyncBound :: MonadBaseControl IO m => m a -> m (Async (StM m a))
asyncBound :: m a -> m (Async (StM m a))
asyncBound = (IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing IO (StM m a) -> IO (Async (StM m a))
forall a. IO a -> IO (Async a)
A.asyncBound
asyncOn :: MonadBaseControl IO m => Int -> m a -> m (Async (StM m a))
asyncOn :: Int -> m a -> m (Async (StM m a))
asyncOn Int
cpu = (IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing (Int -> IO (StM m a) -> IO (Async (StM m a))
forall a. Int -> IO a -> IO (Async a)
A.asyncOn Int
cpu)
asyncWithUnmask
:: MonadBaseControl IO m
=> ((forall b. m b -> m b) -> m a)
-> m (Async (StM m a))
asyncWithUnmask :: ((forall b. m b -> m b) -> m a) -> m (Async (StM m a))
asyncWithUnmask (forall b. m b -> m b) -> m a
actionWith =
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing IO (StM m a) -> IO (Async (StM m a))
forall a. IO a -> IO (Async a)
A.async ((forall b. m b -> m b) -> m a
actionWith ((IO (StM m b) -> IO (StM m b)) -> m b -> m b
forall (b :: * -> *) (m :: * -> *) a c.
MonadBaseControl b m =>
(b (StM m a) -> b (StM m c)) -> m a -> m c
liftBaseOp_ IO (StM m b) -> IO (StM m b)
forall a. IO a -> IO a
unsafeUnmask))
asyncOnWithUnmask
:: MonadBaseControl IO m
=> Int
-> ((forall b. m b -> m b) -> m a)
-> m (Async (StM m a))
asyncOnWithUnmask :: Int -> ((forall b. m b -> m b) -> m a) -> m (Async (StM m a))
asyncOnWithUnmask Int
cpu (forall b. m b -> m b) -> m a
actionWith =
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
(IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing (Int -> IO (StM m a) -> IO (Async (StM m a))
forall a. Int -> IO a -> IO (Async a)
A.asyncOn Int
cpu) ((forall b. m b -> m b) -> m a
actionWith ((IO (StM m b) -> IO (StM m b)) -> m b -> m b
forall (b :: * -> *) (m :: * -> *) a c.
MonadBaseControl b m =>
(b (StM m a) -> b (StM m c)) -> m a -> m c
liftBaseOp_ IO (StM m b) -> IO (StM m b)
forall a. IO a -> IO a
unsafeUnmask))
asyncUsing
:: MonadBaseControl IO m
=> (IO (StM m a) -> IO (Async (StM m a)))
-> m a
-> m (Async (StM m a))
asyncUsing :: (IO (StM m a) -> IO (Async (StM m a)))
-> m a -> m (Async (StM m a))
asyncUsing IO (StM m a) -> IO (Async (StM m a))
fork m a
m =
(RunInBase m IO -> IO (Async (StM m a))) -> m (Async (StM m a))
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith ((RunInBase m IO -> IO (Async (StM m a))) -> m (Async (StM m a)))
-> (RunInBase m IO -> IO (Async (StM m a))) -> m (Async (StM m a))
forall a b. (a -> b) -> a -> b
$ \RunInBase m IO
runInIO -> IO (StM m a) -> IO (Async (StM m a))
fork (m a -> IO (StM m a)
RunInBase m IO
runInIO m a
m)
withAsync
:: MonadBaseControl IO m
=> m a
-> (Async (StM m a) -> m b)
-> m b
withAsync :: m a -> (Async (StM m a) -> m b) -> m b
withAsync = (m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
m a -> m (Async (StM m a))
async
{-# INLINABLE withAsync #-}
withAsyncBound
:: MonadBaseControl IO m
=> m a
-> (Async (StM m a) -> m b)
-> m b
withAsyncBound :: m a -> (Async (StM m a) -> m b) -> m b
withAsyncBound = (m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
m a -> m (Async (StM m a))
asyncBound
{-# INLINABLE withAsyncBound #-}
withAsyncOn
:: MonadBaseControl IO m
=> Int
-> m a
-> (Async (StM m a) -> m b)
-> m b
withAsyncOn :: Int -> m a -> (Async (StM m a) -> m b) -> m b
withAsyncOn = (m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing ((m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b)
-> (Int -> m a -> m (Async (StM m a)))
-> Int
-> m a
-> (Async (StM m a) -> m b)
-> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
Int -> m a -> m (Async (StM m a))
asyncOn
{-# INLINABLE withAsyncOn #-}
withAsyncWithUnmask
:: MonadBaseControl IO m
=> ((forall c. m c -> m c) -> m a)
-> (Async (StM m a) -> m b)
-> m b
withAsyncWithUnmask :: ((forall c. m c -> m c) -> m a) -> (Async (StM m a) -> m b) -> m b
withAsyncWithUnmask (forall c. m c -> m c) -> m a
actionWith =
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
m a -> m (Async (StM m a))
async ((forall c. m c -> m c) -> m a
actionWith ((IO (StM m c) -> IO (StM m c)) -> m c -> m c
forall (b :: * -> *) (m :: * -> *) a c.
MonadBaseControl b m =>
(b (StM m a) -> b (StM m c)) -> m a -> m c
liftBaseOp_ IO (StM m c) -> IO (StM m c)
forall a. IO a -> IO a
unsafeUnmask))
{-# INLINABLE withAsyncWithUnmask #-}
withAsyncOnWithUnmask
:: MonadBaseControl IO m
=> Int
-> ((forall c. m c -> m c) -> m a)
-> (Async (StM m a) -> m b)
-> m b
withAsyncOnWithUnmask :: Int
-> ((forall c. m c -> m c) -> m a)
-> (Async (StM m a) -> m b)
-> m b
withAsyncOnWithUnmask Int
cpu (forall c. m c -> m c) -> m a
actionWith =
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
(m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing (Int -> m a -> m (Async (StM m a))
forall (m :: * -> *) a.
MonadBaseControl IO m =>
Int -> m a -> m (Async (StM m a))
asyncOn Int
cpu) ((forall c. m c -> m c) -> m a
actionWith ((IO (StM m c) -> IO (StM m c)) -> m c -> m c
forall (b :: * -> *) (m :: * -> *) a c.
MonadBaseControl b m =>
(b (StM m a) -> b (StM m c)) -> m a -> m c
liftBaseOp_ IO (StM m c) -> IO (StM m c)
forall a. IO a -> IO a
unsafeUnmask))
{-# INLINABLE withAsyncOnWithUnmask #-}
withAsyncUsing
:: MonadBaseControl IO m
=> (m a -> m (Async (StM m a)))
-> m a
-> (Async (StM m a) -> m b)
-> m b
withAsyncUsing :: (m a -> m (Async (StM m a)))
-> m a -> (Async (StM m a) -> m b) -> m b
withAsyncUsing m a -> m (Async (StM m a))
fork m a
action Async (StM m a) -> m b
inner = ((forall a. m a -> m a) -> m b) -> m b
forall (m :: * -> *) b.
MonadBaseControl IO m =>
((forall a. m a -> m a) -> m b) -> m b
E.mask (((forall a. m a -> m a) -> m b) -> m b)
-> ((forall a. m a -> m a) -> m b) -> m b
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> m a
restore -> do
Async (StM m a)
a <- m a -> m (Async (StM m a))
fork (m a -> m (Async (StM m a))) -> m a -> m (Async (StM m a))
forall a b. (a -> b) -> a -> b
$ m a -> m a
forall a. m a -> m a
restore m a
action
b
r <- m b -> m b
forall a. m a -> m a
restore (Async (StM m a) -> m b
inner Async (StM m a)
a) m b -> (SomeException -> m b) -> m b
forall (m :: * -> *) e a.
(MonadBaseControl IO m, Exception e) =>
m a -> (e -> m a) -> m a
`E.catch` \SomeException
e -> do
Async (StM m a) -> m ()
forall (m :: * -> *) a. MonadBase IO m => Async a -> m ()
cancel Async (StM m a)
a
SomeException -> m b
forall (m :: * -> *) e a. (MonadBase IO m, Exception e) => e -> m a
E.throwIO (SomeException
e :: SomeException)
Async (StM m a) -> m ()
forall (m :: * -> *) a. MonadBase IO m => Async a -> m ()
cancel Async (StM m a)
a
b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
r
wait :: MonadBaseControl IO m => Async (StM m a) -> m a
wait :: Async (StM m a) -> m a
wait = IO (StM m a) -> m (StM m a)
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO (StM m a) -> m (StM m a))
-> (Async (StM m a) -> IO (StM m a))
-> Async (StM m a)
-> m (StM m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async (StM m a) -> IO (StM m a)
forall a. Async a -> IO a
A.wait (Async (StM m a) -> m (StM m a))
-> (StM m a -> m a) -> Async (StM m a) -> m a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM
poll
:: MonadBaseControl IO m
=> Async (StM m a)
-> m (Maybe (Either SomeException a))
poll :: Async (StM m a) -> m (Maybe (Either SomeException a))
poll Async (StM m a)
a =
IO (Maybe (Either SomeException (StM m a)))
-> m (Maybe (Either SomeException (StM m a)))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a) -> IO (Maybe (Either SomeException (StM m a)))
forall a. Async a -> IO (Maybe (Either SomeException a))
A.poll Async (StM m a)
a) m (Maybe (Either SomeException (StM m a)))
-> (Maybe (Either SomeException (StM m a))
-> m (Maybe (Either SomeException a)))
-> m (Maybe (Either SomeException a))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
m (Maybe (Either SomeException a))
-> (Either SomeException (StM m a)
-> m (Maybe (Either SomeException a)))
-> Maybe (Either SomeException (StM m a))
-> m (Maybe (Either SomeException a))
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe (Either SomeException a)
-> m (Maybe (Either SomeException a))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (Either SomeException a)
forall a. Maybe a
Nothing) ((Either SomeException a -> Maybe (Either SomeException a))
-> m (Either SomeException a) -> m (Maybe (Either SomeException a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either SomeException a -> Maybe (Either SomeException a)
forall a. a -> Maybe a
Just (m (Either SomeException a) -> m (Maybe (Either SomeException a)))
-> (Either SomeException (StM m a) -> m (Either SomeException a))
-> Either SomeException (StM m a)
-> m (Maybe (Either SomeException a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither)
cancel :: MonadBase IO m => Async a -> m ()
cancel :: Async a -> m ()
cancel = IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> m ()) -> (Async a -> IO ()) -> Async a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async a -> IO ()
forall a. Async a -> IO ()
A.cancel
cancelWith :: (MonadBase IO m, Exception e) => Async a -> e -> m ()
cancelWith :: Async a -> e -> m ()
cancelWith = (IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> m ()) -> (e -> IO ()) -> e -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((e -> IO ()) -> e -> m ())
-> (Async a -> e -> IO ()) -> Async a -> e -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async a -> e -> IO ()
forall e a. Exception e => Async a -> e -> IO ()
A.cancelWith
uninterruptibleCancel :: MonadBase IO m => Async a -> m ()
uninterruptibleCancel :: Async a -> m ()
uninterruptibleCancel = IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> m ()) -> (Async a -> IO ()) -> Async a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async a -> IO ()
forall a. Async a -> IO ()
A.uninterruptibleCancel
waitCatch
:: MonadBaseControl IO m
=> Async (StM m a)
-> m (Either SomeException a)
waitCatch :: Async (StM m a) -> m (Either SomeException a)
waitCatch Async (StM m a)
a = IO (Either SomeException (StM m a))
-> m (Either SomeException (StM m a))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a) -> IO (Either SomeException (StM m a))
forall a. Async a -> IO (Either SomeException a)
A.waitCatch Async (StM m a)
a) m (Either SomeException (StM m a))
-> (Either SomeException (StM m a) -> m (Either SomeException a))
-> m (Either SomeException a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither
waitAny :: MonadBaseControl IO m => [Async (StM m a)] -> m (Async (StM m a), a)
waitAny :: [Async (StM m a)] -> m (Async (StM m a), a)
waitAny [Async (StM m a)]
as = do
(Async (StM m a)
a, StM m a
s) <- IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a)
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a))
-> IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a)
forall a b. (a -> b) -> a -> b
$ [Async (StM m a)] -> IO (Async (StM m a), StM m a)
forall a. [Async a] -> IO (Async a, a)
A.waitAny [Async (StM m a)]
as
a
r <- StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM StM m a
s
(Async (StM m a), a) -> m (Async (StM m a), a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Async (StM m a)
a, a
r)
waitAnyCatch
:: MonadBaseControl IO m
=> [Async (StM m a)]
-> m (Async (StM m a), Either SomeException a)
waitAnyCatch :: [Async (StM m a)] -> m (Async (StM m a), Either SomeException a)
waitAnyCatch [Async (StM m a)]
as = do
(Async (StM m a)
a, Either SomeException (StM m a)
s) <- IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a)))
-> IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a))
forall a b. (a -> b) -> a -> b
$ [Async (StM m a)]
-> IO (Async (StM m a), Either SomeException (StM m a))
forall a. [Async a] -> IO (Async a, Either SomeException a)
A.waitAnyCatch [Async (StM m a)]
as
Either SomeException a
r <- Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither Either SomeException (StM m a)
s
(Async (StM m a), Either SomeException a)
-> m (Async (StM m a), Either SomeException a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Async (StM m a)
a, Either SomeException a
r)
waitAnyCancel
:: MonadBaseControl IO m
=> [Async (StM m a)]
-> m (Async (StM m a), a)
waitAnyCancel :: [Async (StM m a)] -> m (Async (StM m a), a)
waitAnyCancel [Async (StM m a)]
as = do
(Async (StM m a)
a, StM m a
s) <- IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a)
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a))
-> IO (Async (StM m a), StM m a) -> m (Async (StM m a), StM m a)
forall a b. (a -> b) -> a -> b
$ [Async (StM m a)] -> IO (Async (StM m a), StM m a)
forall a. [Async a] -> IO (Async a, a)
A.waitAnyCancel [Async (StM m a)]
as
a
r <- StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM StM m a
s
(Async (StM m a), a) -> m (Async (StM m a), a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Async (StM m a)
a, a
r)
waitAnyCatchCancel
:: MonadBaseControl IO m
=> [Async (StM m a)]
-> m (Async (StM m a), Either SomeException a)
waitAnyCatchCancel :: [Async (StM m a)] -> m (Async (StM m a), Either SomeException a)
waitAnyCatchCancel [Async (StM m a)]
as = do
(Async (StM m a)
a, Either SomeException (StM m a)
s) <- IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a)))
-> IO (Async (StM m a), Either SomeException (StM m a))
-> m (Async (StM m a), Either SomeException (StM m a))
forall a b. (a -> b) -> a -> b
$ [Async (StM m a)]
-> IO (Async (StM m a), Either SomeException (StM m a))
forall a. [Async a] -> IO (Async a, Either SomeException a)
A.waitAnyCatchCancel [Async (StM m a)]
as
Either SomeException a
r <- Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither Either SomeException (StM m a)
s
(Async (StM m a), Either SomeException a)
-> m (Async (StM m a), Either SomeException a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Async (StM m a)
a, Either SomeException a
r)
waitEither
:: MonadBaseControl IO m
=> Async (StM m a)
-> Async (StM m b)
-> m (Either a b)
waitEither :: Async (StM m a) -> Async (StM m b) -> m (Either a b)
waitEither Async (StM m a)
a Async (StM m b)
b =
IO (Either (StM m a) (StM m b)) -> m (Either (StM m a) (StM m b))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a)
-> Async (StM m b) -> IO (Either (StM m a) (StM m b))
forall a b. Async a -> Async b -> IO (Either a b)
A.waitEither Async (StM m a)
a Async (StM m b)
b) m (Either (StM m a) (StM m b))
-> (Either (StM m a) (StM m b) -> m (Either a b)) -> m (Either a b)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(StM m a -> m (Either a b))
-> (StM m b -> m (Either a b))
-> Either (StM m a) (StM m b)
-> m (Either a b)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ((a -> Either a b) -> m a -> m (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either a b
forall a b. a -> Either a b
Left (m a -> m (Either a b))
-> (StM m a -> m a) -> StM m a -> m (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM) ((b -> Either a b) -> m b -> m (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> Either a b
forall a b. b -> Either a b
Right (m b -> m (Either a b))
-> (StM m b -> m b) -> StM m b -> m (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StM m b -> m b
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM)
waitEitherCatch
:: MonadBaseControl IO m
=> Async (StM m a)
-> Async (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
waitEitherCatch :: Async (StM m a)
-> Async (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
waitEitherCatch Async (StM m a)
a Async (StM m b)
b =
IO
(Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
-> m (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a)
-> Async (StM m b)
-> IO
(Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
forall a b.
Async a
-> Async b
-> IO (Either (Either SomeException a) (Either SomeException b))
A.waitEitherCatch Async (StM m a)
a Async (StM m b)
b) m (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
-> (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b))
-> m (Either (Either SomeException a) (Either SomeException b)))
-> m (Either (Either SomeException a) (Either SomeException b))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(Either SomeException (StM m a)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> Either
(Either SomeException (StM m a)) (Either SomeException (StM m b))
-> m (Either (Either SomeException a) (Either SomeException b))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ((Either SomeException a
-> Either (Either SomeException a) (Either SomeException b))
-> m (Either SomeException a)
-> m (Either (Either SomeException a) (Either SomeException b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either SomeException a
-> Either (Either SomeException a) (Either SomeException b)
forall a b. a -> Either a b
Left (m (Either SomeException a)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m a) -> m (Either SomeException a))
-> Either SomeException (StM m a)
-> m (Either (Either SomeException a) (Either SomeException b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither) ((Either SomeException b
-> Either (Either SomeException a) (Either SomeException b))
-> m (Either SomeException b)
-> m (Either (Either SomeException a) (Either SomeException b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either SomeException b
-> Either (Either SomeException a) (Either SomeException b)
forall a b. b -> Either a b
Right (m (Either SomeException b)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m b) -> m (Either SomeException b))
-> Either SomeException (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either SomeException (StM m b) -> m (Either SomeException b)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither)
waitEitherCancel
:: MonadBaseControl IO m
=> Async (StM m a)
-> Async (StM m b)
-> m (Either a b)
waitEitherCancel :: Async (StM m a) -> Async (StM m b) -> m (Either a b)
waitEitherCancel Async (StM m a)
a Async (StM m b)
b =
IO (Either (StM m a) (StM m b)) -> m (Either (StM m a) (StM m b))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a)
-> Async (StM m b) -> IO (Either (StM m a) (StM m b))
forall a b. Async a -> Async b -> IO (Either a b)
A.waitEitherCancel Async (StM m a)
a Async (StM m b)
b) m (Either (StM m a) (StM m b))
-> (Either (StM m a) (StM m b) -> m (Either a b)) -> m (Either a b)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(StM m a -> m (Either a b))
-> (StM m b -> m (Either a b))
-> Either (StM m a) (StM m b)
-> m (Either a b)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ((a -> Either a b) -> m a -> m (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either a b
forall a b. a -> Either a b
Left (m a -> m (Either a b))
-> (StM m a -> m a) -> StM m a -> m (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM) ((b -> Either a b) -> m b -> m (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> Either a b
forall a b. b -> Either a b
Right (m b -> m (Either a b))
-> (StM m b -> m b) -> StM m b -> m (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StM m b -> m b
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM)
waitEitherCatchCancel
:: MonadBaseControl IO m
=> Async (StM m a)
-> Async (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
waitEitherCatchCancel :: Async (StM m a)
-> Async (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
waitEitherCatchCancel Async (StM m a)
a Async (StM m b)
b =
IO
(Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
-> m (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a)
-> Async (StM m b)
-> IO
(Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
forall a b.
Async a
-> Async b
-> IO (Either (Either SomeException a) (Either SomeException b))
A.waitEitherCatch Async (StM m a)
a Async (StM m b)
b) m (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b)))
-> (Either
(Either SomeException (StM m a)) (Either SomeException (StM m b))
-> m (Either (Either SomeException a) (Either SomeException b)))
-> m (Either (Either SomeException a) (Either SomeException b))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(Either SomeException (StM m a)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> Either
(Either SomeException (StM m a)) (Either SomeException (StM m b))
-> m (Either (Either SomeException a) (Either SomeException b))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ((Either SomeException a
-> Either (Either SomeException a) (Either SomeException b))
-> m (Either SomeException a)
-> m (Either (Either SomeException a) (Either SomeException b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either SomeException a
-> Either (Either SomeException a) (Either SomeException b)
forall a b. a -> Either a b
Left (m (Either SomeException a)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m a) -> m (Either SomeException a))
-> Either SomeException (StM m a)
-> m (Either (Either SomeException a) (Either SomeException b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either SomeException (StM m a) -> m (Either SomeException a)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither) ((Either SomeException b
-> Either (Either SomeException a) (Either SomeException b))
-> m (Either SomeException b)
-> m (Either (Either SomeException a) (Either SomeException b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either SomeException b
-> Either (Either SomeException a) (Either SomeException b)
forall a b. b -> Either a b
Right (m (Either SomeException b)
-> m (Either (Either SomeException a) (Either SomeException b)))
-> (Either SomeException (StM m b) -> m (Either SomeException b))
-> Either SomeException (StM m b)
-> m (Either (Either SomeException a) (Either SomeException b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either SomeException (StM m b) -> m (Either SomeException b)
forall (m :: * -> *) e a.
MonadBaseControl IO m =>
Either e (StM m a) -> m (Either e a)
sequenceEither)
waitEither_
:: MonadBase IO m
=> Async a
-> Async b
-> m ()
waitEither_ :: Async a -> Async b -> m ()
waitEither_ Async a
a Async b
b = IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async a -> Async b -> IO ()
forall a b. Async a -> Async b -> IO ()
A.waitEither_ Async a
a Async b
b)
waitBoth
:: MonadBaseControl IO m
=> Async (StM m a)
-> Async (StM m b)
-> m (a, b)
waitBoth :: Async (StM m a) -> Async (StM m b) -> m (a, b)
waitBoth Async (StM m a)
a Async (StM m b)
b = do
(StM m a
sa, StM m b
sb) <- IO (StM m a, StM m b) -> m (StM m a, StM m b)
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (Async (StM m a) -> Async (StM m b) -> IO (StM m a, StM m b)
forall a b. Async a -> Async b -> IO (a, b)
A.waitBoth Async (StM m a)
a Async (StM m b)
b)
a
ra <- StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM StM m a
sa
b
rb <- StM m b -> m b
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM StM m b
sb
(a, b) -> m (a, b)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
ra, b
rb)
{-# INLINABLE waitBoth #-}
link :: MonadBase IO m => Async a -> m ()
link :: Async a -> m ()
link = IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> m ()) -> (Async a -> IO ()) -> Async a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async a -> IO ()
forall a. Async a -> IO ()
A.link
link2 :: MonadBase IO m => Async a -> Async b -> m ()
link2 :: Async a -> Async b -> m ()
link2 = (IO () -> m ()
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> m ()) -> (Async b -> IO ()) -> Async b -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Async b -> IO ()) -> Async b -> m ())
-> (Async a -> Async b -> IO ()) -> Async a -> Async b -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async a -> Async b -> IO ()
forall a b. Async a -> Async b -> IO ()
A.link2
race :: MonadBaseControl IO m => m a -> m b -> m (Either a b)
race :: m a -> m b -> m (Either a b)
race m a
left m b
right =
m a -> (Async (StM m a) -> m (Either a b)) -> m (Either a b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m a
left ((Async (StM m a) -> m (Either a b)) -> m (Either a b))
-> (Async (StM m a) -> m (Either a b)) -> m (Either a b)
forall a b. (a -> b) -> a -> b
$ \Async (StM m a)
a ->
m b -> (Async (StM m b) -> m (Either a b)) -> m (Either a b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m b
right ((Async (StM m b) -> m (Either a b)) -> m (Either a b))
-> (Async (StM m b) -> m (Either a b)) -> m (Either a b)
forall a b. (a -> b) -> a -> b
$ \Async (StM m b)
b ->
Async (StM m a) -> Async (StM m b) -> m (Either a b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
Async (StM m a) -> Async (StM m b) -> m (Either a b)
waitEither Async (StM m a)
a Async (StM m b)
b
{-# INLINABLE race #-}
race_ :: MonadBaseControl IO m => m a -> m b -> m ()
race_ :: m a -> m b -> m ()
race_ m a
left m b
right =
m a -> (Async (StM m a) -> m ()) -> m ()
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m a
left ((Async (StM m a) -> m ()) -> m ())
-> (Async (StM m a) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Async (StM m a)
a ->
m b -> (Async (StM m b) -> m ()) -> m ()
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m b
right ((Async (StM m b) -> m ()) -> m ())
-> (Async (StM m b) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Async (StM m b)
b ->
Async (StM m a) -> Async (StM m b) -> m ()
forall (m :: * -> *) a b.
MonadBase IO m =>
Async a -> Async b -> m ()
waitEither_ Async (StM m a)
a Async (StM m b)
b
{-# INLINABLE race_ #-}
concurrently :: MonadBaseControl IO m => m a -> m b -> m (a, b)
concurrently :: m a -> m b -> m (a, b)
concurrently m a
left m b
right =
m a -> (Async (StM m a) -> m (a, b)) -> m (a, b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m a
left ((Async (StM m a) -> m (a, b)) -> m (a, b))
-> (Async (StM m a) -> m (a, b)) -> m (a, b)
forall a b. (a -> b) -> a -> b
$ \Async (StM m a)
a ->
m b -> (Async (StM m b) -> m (a, b)) -> m (a, b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> (Async (StM m a) -> m b) -> m b
withAsync m b
right ((Async (StM m b) -> m (a, b)) -> m (a, b))
-> (Async (StM m b) -> m (a, b)) -> m (a, b)
forall a b. (a -> b) -> a -> b
$ \Async (StM m b)
b ->
Async (StM m a) -> Async (StM m b) -> m (a, b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
Async (StM m a) -> Async (StM m b) -> m (a, b)
waitBoth Async (StM m a)
a Async (StM m b)
b
{-# INLINABLE concurrently #-}
concurrently_ :: MonadBaseControl IO m => m a -> m b -> m ()
concurrently_ :: m a -> m b -> m ()
concurrently_ m a
left m b
right = m (a, b) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (a, b) -> m ()) -> m (a, b) -> m ()
forall a b. (a -> b) -> a -> b
$ m a -> m b -> m (a, b)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> m b -> m (a, b)
concurrently m a
left m b
right
{-# INLINABLE concurrently_ #-}
mapConcurrently
:: (Traversable t, MonadBaseControl IO m)
=> (a -> m b)
-> t a
-> m (t b)
mapConcurrently :: (a -> m b) -> t a -> m (t b)
mapConcurrently a -> m b
f = Concurrently m (t b) -> m (t b)
forall (m :: * -> *) a. Concurrently m a -> m a
runConcurrently (Concurrently m (t b) -> m (t b))
-> (t a -> Concurrently m (t b)) -> t a -> m (t b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Concurrently m b) -> t a -> Concurrently m (t b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (m b -> Concurrently m b
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m b -> Concurrently m b) -> (a -> m b) -> a -> Concurrently m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m b
f)
mapConcurrently_
:: (Foldable t, MonadBaseControl IO m)
=> (a -> m b)
-> t a
-> m ()
mapConcurrently_ :: (a -> m b) -> t a -> m ()
mapConcurrently_ a -> m b
f = Concurrently m () -> m ()
forall (m :: * -> *) a. Concurrently m a -> m a
runConcurrently (Concurrently m () -> m ())
-> (t a -> Concurrently m ()) -> t a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Concurrently m ()) -> t a -> Concurrently m ()
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (m () -> Concurrently m ()
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m () -> Concurrently m ())
-> (a -> m ()) -> a -> Concurrently m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m b -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m b -> m ()) -> (a -> m b) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m b
f)
forConcurrently
:: (Traversable t, MonadBaseControl IO m)
=> t a
-> (a -> m b)
-> m (t b)
forConcurrently :: t a -> (a -> m b) -> m (t b)
forConcurrently = ((a -> m b) -> t a -> m (t b)) -> t a -> (a -> m b) -> m (t b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> m b) -> t a -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, MonadBaseControl IO m) =>
(a -> m b) -> t a -> m (t b)
mapConcurrently
forConcurrently_
:: (Foldable t, MonadBaseControl IO m)
=> t a
-> (a -> m b)
-> m ()
forConcurrently_ :: t a -> (a -> m b) -> m ()
forConcurrently_ = ((a -> m b) -> t a -> m ()) -> t a -> (a -> m b) -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> m b) -> t a -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, MonadBaseControl IO m) =>
(a -> m b) -> t a -> m ()
mapConcurrently_
replicateConcurrently
:: MonadBaseControl IO m
=> Int
-> m a
-> m [a]
replicateConcurrently :: Int -> m a -> m [a]
replicateConcurrently Int
n =
Concurrently m [a] -> m [a]
forall (m :: * -> *) a. Concurrently m a -> m a
runConcurrently (Concurrently m [a] -> m [a])
-> (m a -> Concurrently m [a]) -> m a -> m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Concurrently m a] -> Concurrently m [a]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA ([Concurrently m a] -> Concurrently m [a])
-> (m a -> [Concurrently m a]) -> m a -> Concurrently m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Concurrently m a -> [Concurrently m a]
forall a. Int -> a -> [a]
replicate Int
n (Concurrently m a -> [Concurrently m a])
-> (m a -> Concurrently m a) -> m a -> [Concurrently m a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> Concurrently m a
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently
replicateConcurrently_
:: MonadBaseControl IO m
=> Int
-> m a
-> m ()
replicateConcurrently_ :: Int -> m a -> m ()
replicateConcurrently_ Int
n =
Concurrently m () -> m ()
forall (m :: * -> *) a. Concurrently m a -> m a
runConcurrently (Concurrently m () -> m ())
-> (m a -> Concurrently m ()) -> m a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Concurrently m ()] -> Concurrently m ()
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Concurrently m ()] -> Concurrently m ())
-> (m a -> [Concurrently m ()]) -> m a -> Concurrently m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Concurrently m () -> [Concurrently m ()]
forall a. Int -> a -> [a]
replicate Int
n (Concurrently m () -> [Concurrently m ()])
-> (m a -> Concurrently m ()) -> m a -> [Concurrently m ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m () -> Concurrently m ()
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m () -> Concurrently m ())
-> (m a -> m ()) -> m a -> Concurrently m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void
newtype Concurrently m a = Concurrently { Concurrently m a -> m a
runConcurrently :: m a }
instance Functor m => Functor (Concurrently m) where
fmap :: (a -> b) -> Concurrently m a -> Concurrently m b
fmap a -> b
f (Concurrently m a
a) = m b -> Concurrently m b
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m b -> Concurrently m b) -> m b -> Concurrently m b
forall a b. (a -> b) -> a -> b
$ a -> b
f (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
a
instance MonadBaseControl IO m => Applicative (Concurrently m) where
pure :: a -> Concurrently m a
pure = m a -> Concurrently m a
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m a -> Concurrently m a) -> (a -> m a) -> a -> Concurrently m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
Concurrently m (a -> b)
fs <*> :: Concurrently m (a -> b) -> Concurrently m a -> Concurrently m b
<*> Concurrently m a
as =
m b -> Concurrently m b
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m b -> Concurrently m b) -> m b -> Concurrently m b
forall a b. (a -> b) -> a -> b
$ ((a -> b) -> a -> b) -> (a -> b, a) -> b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
($) ((a -> b, a) -> b) -> m (a -> b, a) -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (a -> b) -> m a -> m (a -> b, a)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> m b -> m (a, b)
concurrently m (a -> b)
fs m a
as
instance MonadBaseControl IO m => Alternative (Concurrently m) where
empty :: Concurrently m a
empty = m a -> Concurrently m a
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m a -> Concurrently m a) -> m a -> Concurrently m a
forall a b. (a -> b) -> a -> b
$ (RunInBase m IO -> IO a) -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith ((RunInBase m IO -> IO a) -> m a)
-> (RunInBase m IO -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \RunInBase m IO
_ -> IO () -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (IO () -> IO a) -> IO () -> IO a
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
threadDelay Int
forall a. Bounded a => a
maxBound
Concurrently m a
as <|> :: Concurrently m a -> Concurrently m a -> Concurrently m a
<|> Concurrently m a
bs =
m a -> Concurrently m a
forall (m :: * -> *) a. m a -> Concurrently m a
Concurrently (m a -> Concurrently m a) -> m a -> Concurrently m a
forall a b. (a -> b) -> a -> b
$ (a -> a) -> (a -> a) -> Either a a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> a
forall a. a -> a
id a -> a
forall a. a -> a
id (Either a a -> a) -> m (Either a a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a -> m a -> m (Either a a)
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> m b -> m (Either a b)
race m a
as m a
bs
#if MIN_VERSION_base(4, 9, 0)
instance (MonadBaseControl IO m, Semigroup a) =>
Semigroup (Concurrently m a) where
<> :: Concurrently m a -> Concurrently m a -> Concurrently m a
(<>) = (a -> a -> a)
-> Concurrently m a -> Concurrently m a -> Concurrently m a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>)
instance (MonadBaseControl IO m, Semigroup a, Monoid a) =>
Monoid (Concurrently m a) where
mempty :: Concurrently m a
mempty = a -> Concurrently m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
forall a. Monoid a => a
mempty
mappend :: Concurrently m a -> Concurrently m a -> Concurrently m a
mappend = Concurrently m a -> Concurrently m a -> Concurrently m a
forall a. Semigroup a => a -> a -> a
(<>)
#else
instance (MonadBaseControl IO m, Monoid a) => Monoid (Concurrently m a) where
mempty = pure mempty
mappend = liftA2 mappend
#endif
sequenceEither :: MonadBaseControl IO m => Either e (StM m a) -> m (Either e a)
sequenceEither :: Either e (StM m a) -> m (Either e a)
sequenceEither = (e -> m (Either e a))
-> (StM m a -> m (Either e a))
-> Either e (StM m a)
-> m (Either e a)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Either e a -> m (Either e a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either e a -> m (Either e a))
-> (e -> Either e a) -> e -> m (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Either e a
forall a b. a -> Either a b
Left) ((a -> Either e a) -> m a -> m (Either e a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either e a
forall a b. b -> Either a b
Right (m a -> m (Either e a))
-> (StM m a -> m a) -> StM m a -> m (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StM m a -> m a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM)