úÎy·uà<      !"#$%&'()*+,-./0123456789:;(c) Simon Marlow 2012BSD3 (see the file LICENSE)!Simon Marlow <marlowsd@gmail.com> provisional#non-portable (requires concurrency) TrustworthyBOT5A value of type Concurrently a is an IO, operation that can be composed with other  Concurrently values, using the  Applicative and  Alternative instances.Calling runConcurrently on a value of type Concurrently a will execute the IOL operations it contains concurrently, before delivering the result of type a. For example ¢(page1, page2, page3) <- runConcurrently $ (,,) <$> Concurrently (getURL "url1") <*> Concurrently (getURL "url2") <*> Concurrently (getURL "url3")"An asynchronous action spawned by  or  °. Asynchronous actions are executed in a separate thread, and operations are provided for waiting for asynchronous actions to complete and obtaining their results (see e.g. ). Returns the <" of the thread running the given .2Spawn an asynchronous action in a separate thread.Like  but using = internally.Like  but using > internally.Like  but using ?i internally. The child thread is passed a function that can be used to unmask asynchronous exceptions. Like  but using @i internally. The child thread is passed a function that can be used to unmask asynchronous exceptions. ASpawn an asynchronous action in a separate thread, and pass its AsyncV handle to the supplied function. When the function returns or throws an exception,  is called on the Async. KwithAsync action inner = bracket (async action) uninterruptibleCancel innerThis is a useful variant of  that ensures an Async( is never left running unintentionally. Like   but uses = internally. Like   but uses > internally. Like   but uses ?i internally. The child thread is passed a function that can be used to unmask asynchronous exceptions.Like   but uses @h internally. The child thread is passed a function that can be used to unmask asynchronous exceptions˜Wait for an asynchronous action to complete, and return its value. If the asynchronous action threw an exception, then the exception is re-thrown by . wait = atomically . waitSTM@Wait for an asynchronous action to complete, and return either Left e# if the action raised an exception e, or Right a if it returned a value a. %waitCatch = atomically . waitCatchSTMCheck whether an F has completed yet. If it has not completed yet, then the result is Nothing, otherwise the result is Just e where e is Left x if the Async raised an exception x, or Right a if it returned a value a. poll = atomically . pollSTM A version of , that can be used inside an STM transaction. A version of , that can be used inside an STM transaction. A version of , that can be used inside an STM transaction..Cancel an asynchronous action by throwing the  ThreadKilled' exception to it, and waiting for the ' thread to quit. Has no effect if the  has already completed. @cancel a = throwTo (asyncThreadId a) ThreadKilled <* waitCatch a Note that ) will not terminate until the thread the , refers to has terminated. This means that U will block for as long said thread blocks when receiving an asynchronous exception.For example, it could block if:SIt's executing a foreign call, and thus cannot receive the asynchronous exception;fIt's executing some cleanup handler after having received the exception, and the handler is blocking.Cancel an asynchronous actionThis is a variant of , but it is not interruptible.HCancel an asynchronous action by throwing the supplied exception to it. ,cancelWith a x = throwTo (asyncThreadId a) x*The notes about the synchronous nature of  also apply to .gWait for any of the supplied asynchronous operations to complete. The value returned is a pair of the ; that completed, and the result that would be returned by  on that . If multiple Zs complete or have completed, then the value returned corresponds to the first completed  in the list. A version of , that can be used inside an STM transaction.Like S, but also cancels the other asynchronous operations as soon as one has completed.Wait for any of the supplied Asyncds to complete. If the first to complete throws an exception, then that exception is re-thrown by . If multiple Zs complete or have completed, then the value returned corresponds to the first completed  in the list. A version of , that can be used inside an STM transaction.Like S, but also cancels the other asynchronous operations as soon as one has completed.Wait for the first of two Async s to finish. A version of , that can be used inside an STM transaction. Like  , but also s both Asyncs before returning.!Wait for the first of two Asyncs to finish. If the AsyncO that finished first raised an exception, then the exception is re-thrown by !." A version of !, that can be used inside an STM transaction.#Like !, but the result is ignored.$ A version of #, that can be used inside an STM transaction.%Like ! , but also s both Asyncs before returning.&Waits for both Async|s to finish, but if either of them throws an exception before they have both finished, then the exception is re-thrown by &.' A version of &, that can be used inside an STM transaction.(Link the given Async* to the current thread, such that if the AsyncN raises an exception, that exception will be re-thrown in the current thread.) Link two Asynccs together, such that if either raises an exception, the same exception is re-thrown in the other Async.*Run two IOR actions concurrently, and return the first to finish. The loser of the race is led. Urace left right = withAsync left $ \a -> withAsync right $ \b -> waitEither a b+Like *, but the result is ignored.,Run two IO~ actions concurrently, and return both results. If either action throws an exception at any time, then the other action is (led, and the exception is re-thrown by ,. [concurrently left right = withAsync left $ \a -> withAsync right $ \b -> waitBoth a b-maps an IO-performing function over any  Traversable data type, performing all the IOn actions concurrently, and returning the original data structure with the arguments replaced by the results. For example, mapConcurrently works with lists: 8pages <- mapConcurrently getURL ["url1", "url2", "url3"].. is - with its arguments flipped Fpages <- forConcurrently ["url1", "url2", "url3"] $ \url -> getURL url// is -3 with the return value discarded, just like @mapM_00 is .3 with the return value discarded, just like @forM_1,, but ignore the result values22Perform the action in the given number of threads.3Same as 2, but ignore the results.A¾Fork a thread that runs the supplied action, and if it raises an exception, re-runs the action. The thread terminates only when the action runs to completion without raising an exception.45Only defined by async for  base >= 4.9FBC D E !"#$%&'()*+,F-./0123AGHIJ456789:;4  !"#$%&'()*+,-./01235 !% #&"$'()*+,1-./023ABC D E !"#$%&'()*+,F-./0123AGHIJ456789:;K      !"#$%&'()*+,-./0123456789:;<=>?=@A=>B=>C=>DEFGHIJKLMN$async-2.1.1.1-JMSH0FTb925BZBj7SwNxDHControl.Concurrent.Async ConcurrentlyrunConcurrentlyAsync asyncThreadIdasync asyncBoundasyncOnasyncWithUnmaskasyncOnWithUnmask withAsyncwithAsyncBound withAsyncOnwithAsyncWithUnmaskwithAsyncOnWithUnmaskwait waitCatchpollwaitSTM waitCatchSTMpollSTMcanceluninterruptibleCancel cancelWith waitAnyCatchwaitAnyCatchSTMwaitAnyCatchCancelwaitAny waitAnySTM waitAnyCancelwaitEitherCatchwaitEitherCatchSTMwaitEitherCatchCancel waitEither waitEitherSTM waitEither_waitEitherSTM_waitEitherCancelwaitBoth waitBothSTMlinklink2racerace_ concurrentlymapConcurrentlyforConcurrentlymapConcurrently_forConcurrently_ concurrently_replicateConcurrentlyreplicateConcurrently_$fMonoidConcurrently$fSemigroupConcurrently$fAlternativeConcurrently$fApplicativeConcurrently$fFunctorConcurrently$fFunctorAsync $fOrdAsync $fEqAsyncbase GHC.Conc.SyncThreadIdControl.ConcurrentforkOSforkOnforkIOWithUnmaskforkOnWithUnmask forkRepeat _asyncWait asyncUsingwithAsyncUsing concurrently'catchAlltryAll rawForkIO rawForkOn