From 9d14da7f37944f2808e4531daf0ee061fdb337c1 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sat, 12 Feb 2022 00:54:41 +0100 Subject: [PATCH] New async: Export exceptions and fix types --- src/Quasar/Async/V2.hs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Quasar/Async/V2.hs b/src/Quasar/Async/V2.hs index 28bc797..4952689 100644 --- a/src/Quasar/Async/V2.hs +++ b/src/Quasar/Async/V2.hs @@ -3,6 +3,13 @@ module Quasar.Async.V2 ( async, asyncWithUnmask, + -- ** Async exceptions + CancelAsync(..), + AsyncDisposed(..), + AsyncException(..), + isCancelAsync, + isAsyncDisposed, + -- ** Unmanaged variants unmanagedAsync, unmanagedAsyncWithUnmask, @@ -18,6 +25,7 @@ import Quasar.Exceptions import Quasar.Monad import Quasar.Prelude import Quasar.Resources.Disposer +import Control.Monad.Reader data Async a = Async (Awaitable a) Disposer @@ -66,15 +74,21 @@ unmanagedAsyncWithUnmask worker exChan fn = do pure (() <$ toAwaitable resultVar) -async :: MonadQuasar m => IO a -> m (Async a) +async :: MonadQuasar m => QuasarIO a -> m (Async a) async fn = asyncWithUnmask ($ fn) -asyncWithUnmask :: MonadQuasar m => ((forall b. IO b -> IO b) -> IO a) -> m (Async a) +asyncWithUnmask :: MonadQuasar m => ((forall b. QuasarIO b -> QuasarIO b) -> QuasarIO a) -> m (Async a) asyncWithUnmask fn = do + quasar <- askQuasar worker <- askIOWorker exChan <- askExceptionChannel rm <- askResourceManager runSTM do - as <- unmanagedAsyncWithUnmask worker exChan fn + as <- unmanagedAsyncWithUnmask worker exChan \unmask -> runReaderT (fn (liftUnmask unmask)) quasar attachResource rm as pure as + where + liftUnmask :: (forall b. IO b -> IO b) -> QuasarIO a -> QuasarIO a + liftUnmask unmask innerAction = do + quasar <- askQuasar + liftIO $ unmask $ runReaderT innerAction quasar -- GitLab