@@ -1,3 +1,4 @@
1+{-# LANGUAGE DeriveGeneric #-}
1{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE UndecidableInstances #-}
@@ -31,6 +32,9 @@ import Control.Applicative
31import Control.Monad (MonadPlus)
32import Control.Monad (MonadPlus)
32import Control.Monad.Fix (MonadFix)
33import Control.Monad.Fix (MonadFix)
33import Control.Monad.IO.Class (MonadIO)
34import Control.Monad.IO.Class (MonadIO)
35+import GHC.Generics (Generic)
36+import qualified Control.Newtype as NT
34import Control.Monad.Ether.Reader.Class
38import Control.Monad.Ether.Reader.Class
35import Control.Monad.Ether.State.Class
39import Control.Monad.Ether.State.Class
36import Control.Monad.Ether.Except.Class
40import Control.Monad.Ether.Except.Class
@@ -43,9 +47,12 @@ import qualified Control.Monad.Writer as Class
44-- | Wrap a monad to attach a tag to it.
48-- | Wrap a monad to attach a tag to it.
45newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
49newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
46− deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
51+ , Functor, Applicative, Alternative, Monad, MonadPlus
47 , MonadFix, MonadIO )
52 , MonadFix, MonadIO )
54+instance NT.Newtype (WrappedEther tag m a)
49-- | Annotate a polymorphic monadic computation with a tag.
56-- | Annotate a polymorphic monadic computation with a tag.
50ethered :: proxy tag -> WrappedEther tag m a -> m a
57ethered :: proxy tag -> WrappedEther tag m a -> m a
51ethered _proxy = unwrapEther
58ethered _proxy = unwrapEther