diff --git a/src/Control/Monad/Codensity.hs b/src/Control/Monad/Codensity.hs index 3ccc3ea..de6c5fd 100644 --- a/src/Control/Monad/Codensity.hs +++ b/src/Control/Monad/Codensity.hs @@ -42,10 +42,12 @@ import Control.Applicative import Control.Monad (MonadPlus(..)) import qualified Control.Monad.Fail as Fail import Control.Monad.Free +import Control.Monad.Error.Class import Control.Monad.IO.Class import Control.Monad.Reader.Class import Control.Monad.State.Class import Control.Monad.Trans.Class +import Control.Monad.Trans.Cont import Data.Functor.Adjunction import Data.Functor.Apply import Data.Functor.Kan.Ran @@ -248,6 +250,17 @@ instance (Functor f, MonadFree f m) => MonadFree f (Codensity m) where wrap t = Codensity (\h -> wrap (fmap (\p -> runCodensity p h) t)) {-# INLINE wrap #-} +instance {-# OVERLAPPING #-} MonadError e (ContT e (Codensity m)) where + throwError e = ContT (const (pure e)) + catchError c recover = ContT $ \successHandler -> Codensity $ \errorHandler -> + runCodensity (runContT c successHandler) + $ \e -> runCodensity (runContT (recover e) successHandler) errorHandler + +instance MonadError e m => MonadError e (Codensity m) where + throwError e = Codensity (const (throwError e)) + catchError c recover = + Codensity $ \k -> catchError (runCodensity c k) $ \e -> runCodensity (recover e) k + instance MonadReader r m => MonadState r (Codensity m) where get = Codensity (ask >>=) {-# INLINE get #-}