diff --git a/src/Quasar/Awaitable.hs b/src/Quasar/Awaitable.hs index 4a07aedc4465dcb8fabc3759f1180fd76cc26726..47ff5776c41d347499d1cbc4d6e0be8011032e3b 100644 --- a/src/Quasar/Awaitable.hs +++ b/src/Quasar/Awaitable.hs @@ -13,7 +13,8 @@ module Quasar.Awaitable ( awaitableFromSTM, -- * Awaitable helpers - + afix, + afix_, awaitSuccessOrFailure, -- ** Awaiting multiple awaitables @@ -370,6 +371,22 @@ awaitSuccessOrFailure = await . fireAndForget . toAwaitable fireAndForget :: MonadCatch m => m r -> m () fireAndForget x = void x `catchAll` const (pure ()) +afix :: (MonadIO m, MonadCatch m) => (Awaitable a -> m a) -> m a +afix action = do + var <- newAsyncVar + catchAll + do + result <- action (toAwaitable var) + putAsyncVar_ var result + pure result + \ex -> do + failAsyncVar_ var ex + throwM ex + +afix_ :: (MonadIO m, MonadCatch m) => (Awaitable a -> m a) -> m () +afix_ = void . afix + + -- ** Awaiting multiple awaitables