packages feed

text-show-instances-3.3: tests/Instances/Data/Functor/Trans.hs

{-# LANGUAGE CPP                        #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving         #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module:      Instances.Data.Functor.Trans
Copyright:   (C) 2014-2016 Ryan Scott
License:     BSD-style (see the file LICENSE)
Maintainer:  Ryan Scott
Stability:   Provisional
Portability: GHC

Provides 'Arbitrary' instances for functor transformers.
-}
module Instances.Data.Functor.Trans () where

import Data.Functor.Compose  (Compose(..))
#if !(MIN_VERSION_QuickCheck(2,9,0))
import Data.Functor.Constant (Constant(..))
#endif
import Data.Functor.Product  (Product(..))
import Data.Functor.Reverse  (Reverse(..))
import Data.Functor.Sum      (Sum(..))

import Prelude ()
import Prelude.Compat

import Test.QuickCheck (Arbitrary(..), oneof)

deriving instance Arbitrary (f (g a)) => Arbitrary (Compose f g a)
#if !(MIN_VERSION_QuickCheck(2,9,0))
deriving instance Arbitrary a         => Arbitrary (Constant a b)
#endif
deriving instance Arbitrary (f a)     => Arbitrary (Reverse f a)

instance (Arbitrary (f a), Arbitrary (g a)) => Arbitrary (Product f g a) where
    arbitrary = Pair <$> arbitrary <*> arbitrary

instance (Arbitrary (f a), Arbitrary (g a)) => Arbitrary (Sum f g a) where
    arbitrary = oneof [InL <$> arbitrary, InR <$> arbitrary]