@@ -1,3 +1,4 @@
1+{-# LANGUAGE DeriveGeneric #-}
12{-# LANGUAGE MultiParamTypeClasses #-}
23{-# LANGUAGE TypeFamilies #-}
34{-# LANGUAGE FlexibleInstances #-}
@@ -35,6 +36,8 @@ import Control.Monad.Fix (MonadFix)
3536import Control.Monad.Trans.Class (MonadTrans, lift)
3637import Control.Monad.IO.Class (MonadIO)
3738import Control.Ether.Tags (Taggable(..), Tagged(..))
39+import GHC.Generics (Generic)
40+import qualified Control.Newtype as NT
3841
3942import qualified Control.Monad.Signatures as Sig
4043import qualified Control.Monad.Trans.Reader as Trans
@@ -59,17 +62,18 @@ type Reader tag r = ReaderT tag r Identity
5962-- The 'return' function ignores the environment, while '>>=' passes
6063-- the inherited environment to both subcomputations.
6164newtype ReaderT tag r m a = ReaderT (Trans.ReaderT r m a)
62− deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
65+ deriving ( Generic
66+ , Functor, Applicative, Alternative, Monad, MonadPlus
6367 , MonadFix, MonadTrans, MonadIO )
6468
69+instance NT.Newtype (ReaderT tag r m a)
70+
6571instance Taggable (ReaderT tag r m) where
6672 type Tag (ReaderT tag r m) = 'Just tag
6773 type Inner (ReaderT tag r m) = 'Just m
6874
6975instance Tagged (ReaderT tag r m) tag where
7076 type Untagged (ReaderT tag r m) = Trans.ReaderT r m
71− tagged _ = ReaderT
72− untagged _ (ReaderT a) = a
7377
7478-- | Constructor for computations in the reader monad transformer.
7579readerT :: proxy tag -> (r -> m a) -> ReaderT tag r m a