@@ -11,13 +11,15 @@ import Control.Applicative (Alternative)
1111import Control.Monad (MonadPlus)
1212import Control.Monad.Fix (MonadFix)
1313import Control.Monad.IO.Class (MonadIO)
14−import Control.Monad.Ether.Reader
15−import Control.Monad.Ether.State
16−import Control.Monad.Ether.Except
14+import Control.Monad.Ether.Reader.Class
15+import Control.Monad.Ether.State.Class
16+import Control.Monad.Ether.Except.Class
17+import Control.Monad.Ether.Writer.Class
1718
1819import qualified Control.Monad.Reader as Class
1920import qualified Control.Monad.State as Class
2021import qualified Control.Monad.Except as Class
22+import qualified Control.Monad.Writer as Class
2123
2224newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
2325 deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
@@ -35,5 +37,10 @@ instance MonadExcept tag e m => Class.MonadError e (WrappedEther tag m) where
3537 throwError = WrapEther . throw (Proxy :: Proxy tag)
3638 catchError m h = WrapEther $ catch (Proxy :: Proxy tag) (unwrapEther m) (unwrapEther . h)
3739
40+instance MonadWriter tag w m => Class.MonadWriter w (WrappedEther tag m) where
41+ tell = WrapEther . tell (Proxy :: Proxy tag)
42+ listen = WrapEther . listen (Proxy :: Proxy tag) . unwrapEther
43+ pass = WrapEther . pass (Proxy :: Proxy tag) . unwrapEther
44+
3845ethered :: proxy tag -> WrappedEther tag m a -> m a
3946ethered _proxy = unwrapEther