h&QA'      !"#$%&'()*+,-./ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                               Safe-Inferred%&)*/158; effectfulProvide the ability to run  computations concurrently in multiple threads and communicate between them.Warning:4 unless you stick to high level functions from the  family, the  effect makes it possible to escape the scope of any scoped effect operation. Consider the following:-import qualified Effectful.Reader.Static as RprintAsk msg = liftIO . putStrLn . (msg ++) . (": " ++) =<< R.ask:{4 runEff . R.runReader "GLOBAL" . runConcurrent $ do% a <- R.local (const "LOCAL") $ do a <- async $ do printAsk "child (first)" threadDelay 20000! printAsk "child (second)" threadDelay 10000 printAsk "parent (inside)" pure a printAsk "parent (outside)" wait a:}child (first): LOCALparent (inside): LOCALparent (outside): GLOBALchild (second): LOCALNote that the asynchronous computation doesn't respect the scope of <, i.e. the child thread still behaves like it's inside the = block, even though the parent thread already got out of it.*This is because the value provided by the  effect is thread local, i.e. each thread manages its own version of it. For the  it is the only reasonable behavior, it wouldn't be very useful if its "read only" value was affected by calls to " from its parent or child threads.However, the cut isn't so clear if it comes to effects that provide access to a mutable state. That's why statically dispatched State and Writer0 effects come in two flavors, local and shared:3import qualified Effectful.State.Static.Local as SL:{1 runEff . SL.execState "Hi" . runConcurrent $ do1 replicateConcurrently_ 3 $ SL.modify (++ "!"):}"Hi"4import qualified Effectful.State.Static.Shared as SS:{1 runEff . SS.execState "Hi" . runConcurrent $ do1 replicateConcurrently_ 3 $ SS.modify (++ "!"):}"Hi!!!"In the first example state updates made concurrently are not reflected in the parent thread because the value is thread local, but in the second example they are, because the value is shared. effectfulRun the  effect. Safe-Inferred%&)*/158; effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted .   Safe-Inferred%&)*/158;l8 effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted .       Safe-Inferred%&)*/158; effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . Safe-Inferred%&)*/158;  effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted ...  Safe-Inferred%&)*/158;$ effectfulLifted . effectfulLifted " that evaluates the value to WHNF. effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted & that evaluates the new value to WHNF. effectfulLifted . effectfulLifted & that evaluates the new value to WHNF. effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted & that evaluates the new value to WHNF. effectfulLifted & that evaluates the new value to WHNF. effectfulLifted & that evaluates the new value to WHNF. effectfulLifted & that evaluates the new value to WHNF. effectfulLifted ... Safe-Inferred%&)*/158;% effectfulLifted . effectfulLifted . effectfulLifted . Safe-Inferred%&)*/158;&w effectfulLifted . effectfulLifted . effectfulLifted . Safe-Inferred%&)*/158;(j  effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted . effectfulLifted ._`abcdefghijklmnopqrstuvwxyz{|}~_ba`muvqtsornpwx}{~|yzcjhfigldek  Safe-Inferred%&)*/158;+I  effectful<;:987653@4>6?3@ABCDEFEGEHEIJKJLJMJNJOPQRSTRSURSVRSWRSXRSYRZ[RZ\RZ]RZ^RZ_RZ`RZaRZbRZcRZdRZeRZfghighjghkghlgmngmogmpgmqgmrgmsgmtgmugmvgmwgmxgmygmzgm{gm|gm}gm~gmgmgmgmgmgmgmgmgm                                                                                                            ------66+6666666666++++++++6PPPPPPPPP///111666RSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRS333ghgghghghghghghghghghghghghghghghggg(effectful-2.2.0.0-Gum7geQMDWZHcPltICfjuKEffectful.FileSystem.IOEffectful.Concurrent.AsyncEffectful.ConcurrentEffectful.Concurrent.ChanEffectful.Concurrent.QSemEffectful.Concurrent.QSemNEffectful.Concurrent.STMEffectful.Concurrent.MVarEffectful.FileSystemEffectful.Process Effectful.Concurrent.MVar.StrictEffectful.EnvironmentEffectful.FileSystem.IO.FileEffectful.TemporaryEffectful.TimeoutEffectful.Concurrent.Effect withAsyncEffectful.Reader.StaticlocalReaderEforkOSWithUnmaskEffectful.FileSystem.EffectbaseGHC.IO.Handle.TypesHandle"async-2.2.4-IVpPLhVqfDpBC5ysMXR9qgControl.Concurrent.Async waitBothSTMwaitEitherSTM_ waitEitherSTMwaitEitherCatchSTM waitAnySTMwaitAnyCatchSTMpollSTM waitCatchSTMwaitSTM compareAsyncs asyncThreadIdAsyncAsyncCancelledExceptionInLinkedThreadControl.ConcurrentrtsSupportsBoundThreadsControl.Concurrent.ChanChanControl.Concurrent.QSemQSemControl.Concurrent.QSemNQSemNGHC.IO.StdHandlesstdinstderr GHC.Conc.SyncTVarSTM writeTVarthrowSTMretryreadTVarorElsenewTVarcatchSTMstdout NoBuffering LineBufferingBlockBuffering BufferMode GHC.IO.Device SeekFromEnd RelativeSeek AbsoluteSeekSeekMode GHC.IO.IOMode WriteMode ReadWriteModeReadMode AppendModeIOModeGHC.MVarMVardirectory-1.3.6.2System.DirectorysetOwnerWritablesetOwnerSearchablesetOwnerReadablesetOwnerExecutable exeExtensionemptyPermissions System.Directory.Internal.Common XdgDataDirs XdgConfigDirsXdgDirectoryListXdgData XdgConfigXdgCache XdgDirectorywritable searchablereadable executable Permissionsprocess-1.6.13.2System.ProcessPidshowCommandForUsershellprocSystem.Process.Common UseHandleNoStreamInherit CreatePipe StdStream ProcessHandleuse_process_jobsstd_outstd_instd_err new_sessionenvdetach_console delegate_ctlccwdcreate_new_console create_groupcmdspec close_fds child_user child_group CreateProcess ShellCommand RawCommandCmdSpec stm-2.5.0.2Control.Monad.STMcheckControl.Concurrent.STM.TVarswapTVar modifyTVar' modifyTVarControl.Concurrent.STM.TQueueTQueue writeTQueue unGetTQueue tryReadTQueue tryPeekTQueue readTQueue peekTQueue newTQueue isEmptyTQueue flushTQueueControl.Concurrent.STM.TMVarTMVar tryTakeTMVar tryReadTMVar tryPutTMVar takeTMVar swapTMVar readTMVarputTMVarnewTMVar newEmptyTMVar isEmptyTMVarControl.Concurrent.STM.TChanTChan writeTChan unGetTChan tryReadTChan tryPeekTChan readTChan peekTChannewTChannewBroadcastTChan isEmptyTChandupTChan cloneTChanControl.Concurrent.STM.TBQueueTBQueue writeTBQueue unGetTBQueuetryReadTBQueuetryPeekTBQueue readTBQueue peekTBQueue newTBQueue lengthTBQueue isFullTBQueueisEmptyTBQueue flushTBQueue(unliftio-0.2.22.0-B7yEMINQ8N11T7cndnjCmcUnliftIO.Internals.AsyncEmptyWithNoAlternative ConcException Concurrent runConcurrentnewChan writeChanreadChandupChangetChanContentswriteList2Chan ConcurrentlyrunConcurrentlyConcasync asyncBoundasyncOnasyncWithUnmaskasyncOnWithUnmaskwithAsyncBound withAsyncOnwithAsyncWithUnmaskwithAsyncOnWithUnmaskwaitpollcancel cancelWithuninterruptibleCancel waitCatchwaitAny waitAnyCatch waitAnyCancelwaitAnyCatchCancel waitEitherwaitEitherCatchwaitEitherCancelwaitEitherCatchCancel waitEither_waitBothlinklinkOnlylink2 link2Onlyracerace_ concurrently concurrently_mapConcurrentlymapConcurrently_forConcurrentlyforConcurrently_replicateConcurrentlyreplicateConcurrently_pooledMapConcurrentlyNpooledMapConcurrentlypooledMapConcurrentlyN_pooledMapConcurrently_pooledForConcurrentlyNpooledForConcurrentlypooledForConcurrentlyN_pooledForConcurrently_pooledReplicateConcurrentlyNpooledReplicateConcurrentlypooledReplicateConcurrentlyN_pooledReplicateConcurrently_concrunConc $fMonoidConc$fSemigroupConc$fAlternativeConc$fApplicativeConc$fMonoidConcurrently$fSemigroupConcurrently$fAlternativeConcurrently$fApplicativeConcurrently$fFunctorConcurrently $fFunctorConc myThreadIdforkIO forkFinallyforkIOWithUnmask killThreadthrowToforkOnforkOnWithUnmaskgetNumCapabilitiessetNumCapabilitiesgetNumProcessorsthreadCapabilityyield threadDelaythreadWaitReadthreadWaitWritethreadWaitReadSTMthreadWaitWriteSTMforkOSisCurrentThreadBoundrunInBoundThreadrunInUnboundThreadmkWeakThreadId newEmptyMVarnewMVartakeMVarputMVarreadMVarswapMVar tryTakeMVar tryPutMVar isEmptyMVar tryReadMVarwithMVarwithMVarMasked modifyMVar_ modifyMVarmodifyMVarMasked_modifyMVarMasked mkWeakMVarnewQSemwaitQSem signalQSemnewQSemN waitQSemN signalQSemN atomically newTVarIO readTVarIO registerDelay mkWeakTVar newTMVarIOnewEmptyTMVarIO mkWeakTMVar newTChanIOnewBroadcastTChanIO newTQueueIO newTBQueueIO EnvironmentrunEnvironmentgetArgsgetEnvgetEnvironmentgetExecutablePath getProgName lookupEnvsetEnvunsetEnvwithArgs withProgName FileSystem runFileSystemcreateDirectorycreateDirectoryIfMissingremoveDirectoryremoveDirectoryRecursiveremovePathForciblyrenameDirectory listDirectorygetDirectoryContentsgetCurrentDirectorysetCurrentDirectorywithCurrentDirectorygetHomeDirectorygetXdgDirectorygetXdgDirectoryListgetAppUserDataDirectorygetUserDocumentsDirectorygetTemporaryDirectory removeFile renameFile renamePathcopyFilecopyFileWithMetadata getFileSizecanonicalizePath makeAbsolutemakeRelativeToCurrentDirectory doesPathExist doesFileExistdoesDirectoryExistfindExecutablefindExecutablesfindExecutablesInDirectoriesfindFile findFiles findFileWith findFilesWithcreateFileLinkcreateDirectoryLinkremoveDirectoryLinkpathIsSymbolicLinkgetSymbolicLinkTargetgetPermissionssetPermissionscopyPermissions getAccessTimegetModificationTime setAccessTimesetModificationTimewithFilewithBinaryFileopenFilehClosehFlush hFileSize hSetFileSizehIsEOF hSetBuffering hGetBufferinghSeekhTellhIsOpen hIsClosed hIsReadable hIsWritable hIsSeekablehIsTerminalDevicehSetEchohGetEcho hWaitForInputhReadywriteBinaryFilewriteBinaryFileAtomicwriteBinaryFileDurablewriteBinaryFileDurableAtomicwithBinaryFileAtomicwithBinaryFileDurablewithBinaryFileDurableAtomicensureFileDurableProcess runProcess createProcesscreateProcess_ callProcess callCommand spawnProcess spawnCommandreadCreateProcess readProcessreadCreateProcessWithExitCodereadProcessWithExitCodewithCreateProcesscleanupProcessgetPid getCurrentPidwaitForProcessgetProcessExitCodeterminateProcessinterruptProcessGroupOf createPipe createPipeFd Temporary runTemporarywithSystemTempFilewithSystemTempDirectory withTempFilewithTempDirectoryTimeout runTimeouttimeout-effectful-core-2.2.0.0-Kyri5MZEr2L4xwbpq1goifEffectful.Internal.MonadEff GHC.Conc.IOControl.Concurrent.MVarSystem.Environment!System.Environment.ExecutablePath GHC.IO.HandleGHC.IO.Handle.Text System.IOUnliftIO.IO.File UnliftIO.IOSystem.Process.InternalsUnliftIO.Temporary openTempFileSystem.Timeout