{-# LANGUAGE CPP #-}
{-# LANGUAGE KindSignatures #-}

{-# OPTIONS_GHC -Wall #-}

{-| This library provides sets of properties that should hold for common
    typeclasses.

    /Note:/ on GHC < 8.6, this library uses the higher-kinded typeclasses
    ('Data.Functor.Classes.Show1', 'Data.Functor.Classes.Eq1', 'Data.Functor.Classes.Ord1', etc.),
    but on GHC >= 8.6, it uses @-XQuantifiedConstraints@ to express these
    constraints more cleanly.
-}
module Test.QuickCheck.Classes
  ( -- * Running
    QCB.lawsCheck
  , QCB.lawsCheckMany
  , QCB.lawsCheckOne
    -- * Properties
    -- ** Ground types
#if MIN_VERSION_base(4,7,0)
  , QCB.bitsLaws
#endif
  , QCB.eqLaws
  , QCB.substitutiveEqLaws
  , QCB.numLaws
  , QCB.integralLaws
  , QCB.ixLaws
#if MIN_VERSION_base(4,7,0)
  , QCB.isListLaws
#endif
#if HAVE_AESON
  , jsonLaws
#endif
  , QCB.monoidLaws
  , QCB.commutativeMonoidLaws
  , QCB.semigroupMonoidLaws
  , QCB.ordLaws
  , QCB.enumLaws
  , QCB.boundedEnumLaws
  , primLaws
  , QCB.semigroupLaws
  , QCB.commutativeSemigroupLaws
  , QCB.exponentialSemigroupLaws
  , QCB.idempotentSemigroupLaws
  , QCB.rectangularBandSemigroupLaws
#if HAVE_SEMIRINGS
  , semiringLaws
  , ringLaws
  , gcdDomainLaws
  , euclideanLaws
#endif
  , QCB.showLaws
  , QCB.showReadLaws
  , QCB.storableLaws
#if MIN_VERSION_base(4,5,0)
  , QCB.genericLaws
  , QCB.generic1Laws
#endif
#if HAVE_UNARY_LAWS
    -- ** Unary type constructors
  , QCB.alternativeLaws
#if HAVE_SEMIGROUPOIDS
  , altLaws
  , applyLaws
#endif
  , QCB.applicativeLaws
  , QCB.contravariantLaws
  , QCB.foldableLaws
  , QCB.functorLaws
  , QCB.monadLaws
  , QCB.monadPlusLaws
  , QCB.monadZipLaws
#if HAVE_SEMIGROUPOIDS
  , plusLaws
  , extendedPlusLaws
#endif
  , QCB.traversableLaws
#endif
#if HAVE_BINARY_LAWS
    -- ** Binary type constructors
  , QCB.bifoldableLaws
  , QCB.bifunctorLaws
  , QCB.bitraversableLaws
  , QCB.categoryLaws
  , QCB.commutativeCategoryLaws
#if HAVE_SEMIGROUPOIDS
  , semigroupoidLaws
  , commutativeSemigroupoidLaws
#endif
#if HAVE_VECTOR
  , muvectorLaws
#endif
#endif
    -- * Types
  , QCB.Laws(..)
  , QCB.Proxy1(..)
  , QCB.Proxy2(..)
  ) where

--
-- re-exports
--

-- Ground Types
#if MIN_VERSION_base(4,7,0)
import Test.QuickCheck.Classes.IsList
#endif
#if HAVE_AESON
import Test.QuickCheck.Classes.Json
#endif
import Test.QuickCheck.Classes.Prim
#if HAVE_SEMIRINGS
import Test.QuickCheck.Classes.Euclidean
import Test.QuickCheck.Classes.Semiring
import Test.QuickCheck.Classes.Ring
#endif
-- Unary type constructors
#if HAVE_UNARY_LAWS
#if HAVE_SEMIGROUPOIDS
import Test.QuickCheck.Classes.Alt
import Test.QuickCheck.Classes.Apply
#endif
#if HAVE_SEMIGROUPOIDS
import Test.QuickCheck.Classes.Plus
#endif
#endif

-- Binary type constructors
#if HAVE_BINARY_LAWS
#if HAVE_SEMIGROUPOIDS
import Test.QuickCheck.Classes.Semigroupoid
#endif
#endif

#if HAVE_VECTOR
import Test.QuickCheck.Classes.MVector
#endif

import qualified Test.QuickCheck.Classes.Base as QCB