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