test-monad-laws-0.0.0.0: src/Test/Monad/Instances.hs
{-# LANGUAGE
FlexibleContexts,
FlexibleInstances,
MultiParamTypeClasses,
GeneralizedNewtypeDeriving,
StandaloneDeriving,
TypeFamilies,
UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Test.Monad.Instances where
import Control.Monad.Cont
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Writer
import Test.QuickCheck (Gen)
import Test.QuickCheck.HigherOrder (CoArbitrary(..), cogenEmbed, Constructible(..), TestEq(..))
instance Constructible (r -> m a) => Constructible (ReaderT r m a) where
type Repr (ReaderT r m a) = Repr (r -> m a)
fromRepr = ReaderT . fromRepr
instance (TestEq (r -> m a)) => TestEq (ReaderT r m a) where
ReaderT f =? ReaderT g = f =? g
instance (CoArbitrary Gen (m r), Constructible a, Constructible (m r)) => Constructible (ContT r m a) where
type Repr (ContT r m a) = Repr ((a -> m r) -> m r)
fromRepr = ContT . fromRepr
instance (TestEq ((a -> m r) -> m r)) => TestEq (ContT r m a) where
ContT f =? ContT g = f =? g
instance (CoArbitrary Gen a, CoArbitrary Gen (m r), Constructible (m r)) => CoArbitrary Gen (ContT r m a) where
coarbitrary = cogenEmbed "runContT" runContT coarbitrary
instance Constructible (m (Either e a)) => Constructible (ExceptT e m a) where
type Repr (ExceptT e m a) = Repr (m (Either e a))
fromRepr = ExceptT . fromRepr
instance TestEq (m (Either e a)) => TestEq (ExceptT e m a) where
ExceptT m =? ExceptT n = m =? n
instance Constructible (s -> m (a, s)) => Constructible (StateT s m a) where
type Repr (StateT s m a) = Repr (s -> m (a, s))
fromRepr = StateT . fromRepr
instance TestEq (s -> m (a, s)) => TestEq (StateT s m a) where
StateT f =? StateT g = f =? g
instance (Constructible s, CoArbitrary Gen (m (a, s))) => CoArbitrary Gen (StateT s m a) where
coarbitrary = cogenEmbed "runStateT" runStateT coarbitrary
instance TestEq (m (a, w)) => TestEq (WriterT w m a) where
WriterT m =? WriterT n = m =? n
instance Constructible (m (a, w)) => Constructible (WriterT w m a) where
type Repr (WriterT w m a) = Repr (m (a, w))
fromRepr = WriterT . fromRepr