@@ -13,9 +13,11 @@ import Control.Monad.Fix (MonadFix)
13import Control.Monad.IO.Class (MonadIO)
13import Control.Monad.IO.Class (MonadIO)
14import Control.Monad.Ether.Reader
14import Control.Monad.Ether.Reader
15import Control.Monad.Ether.State
15import Control.Monad.Ether.State
16+import Control.Monad.Ether.Except
17import qualified Control.Monad.Reader as Class
18import qualified Control.Monad.Reader as Class
18import qualified Control.Monad.State as Class
19import qualified Control.Monad.State as Class
20+import qualified Control.Monad.Except as Class
20newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
22newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
21 deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
23 deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
@@ -29,5 +31,9 @@ instance MonadState tag s m => Class.MonadState s (WrappedEther tag m) where
29 get = WrapEther $ get (Proxy :: Proxy tag)
31 get = WrapEther $ get (Proxy :: Proxy tag)
30 put = WrapEther . put (Proxy :: Proxy tag)
32 put = WrapEther . put (Proxy :: Proxy tag)
34+instance MonadExcept tag e m => Class.MonadError e (WrappedEther tag m) where
35+ throwError = WrapEther . throw (Proxy :: Proxy tag)
36+ catchError m h = WrapEther $ catch (Proxy :: Proxy tag) (unwrapEther m) (unwrapEther . h)
32ethered :: proxy tag -> WrappedEther tag m a -> m a
38ethered :: proxy tag -> WrappedEther tag m a -> m a
33ethered _proxy = unwrapEther
39ethered _proxy = unwrapEther