From 2eb06abfdd67de75ac54057124df0f743cf8d347 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Wed, 1 Sep 2021 00:39:49 +0200 Subject: [PATCH] Add MonadFail constraint to MonadAwait --- src/Quasar/Awaitable.hs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Quasar/Awaitable.hs b/src/Quasar/Awaitable.hs index acf4d24..401c01d 100644 --- a/src/Quasar/Awaitable.hs +++ b/src/Quasar/Awaitable.hs @@ -59,7 +59,7 @@ import Data.Sequence import Quasar.Prelude -class (MonadCatch m, MonadPlus m) => MonadAwait m where +class (MonadCatch m, MonadFail m, MonadPlus m) => MonadAwait m where -- | Wait until an awaitable is completed and then return it's value (or throw an exception). await :: IsAwaitable r a => a -> m r @@ -194,7 +194,7 @@ awaitableFromSTM :: forall m a. MonadIO m => STM a -> m (Awaitable a) awaitableFromSTM transaction = cacheAwaitable (unsafeAwaitSTM transaction :: Awaitable a) -instance {-# OVERLAPS #-} (MonadCatch m, MonadPlus m) => MonadAwait (ReaderT (QueryFn m) m) where +instance {-# OVERLAPS #-} (MonadCatch m, MonadFail m, MonadPlus m) => MonadAwait (ReaderT (QueryFn m) m) where await = runAwaitable unsafeAwaitSTM transaction = do QueryFn querySTMFn <- ask @@ -271,6 +271,9 @@ instance MonadCatch AwaitableStepM where catch result@(AwaitableFailed ex) handler = maybe result handler $ fromException ex catch (AwaitableStep query next) handler = AwaitableStep query (\x -> next x `catch` handler) +instance MonadFail AwaitableStepM where + fail = throwM . userError + instance Alternative AwaitableStepM where x <|> y = x `catchAll` const y empty = throwM $ toException $ userError "empty" -- GitLab