```--------------------------------------------------------------------
-- |
-- Module    : Test.SmallCheck
-- Copyright : (c) Colin Runciman et al.
-- Maintainer: Roman Cheplyaka <roma@ro-che.info>
--
-- This module exports the main pieces of SmallCheck functionality.
--
-- To generate test cases for your own types, refer to
-- "Test.SmallCheck.Series".
--
-- For pointers to other sources of information about SmallCheck, please refer
--------------------------------------------------------------------
module Test.SmallCheck (
-- * Constructing tests

-- | The simplest kind of test is a function (possibly of many
-- arguments) returning 'Bool'. The function arguments are interpreted
-- as being universally, existentially or uniquely quantified, depending
-- on the quantification context.
--
-- The default quantification context is universal ('forAll').
--
-- 'forAll', 'exists' and 'existsUnique' functions set the quantification
-- context for function arguments. Depending on the quantification
-- context, the test @\\x y -> p x y@ may be equivalent to:
--
-- * ∀ x, y. p x y ('forAll')
--
-- * ∃ x, y: p x y ('exists')
--
-- * ∃! x, y: p x y ('existsUnique')
--
-- The quantification context affects all the variables immediately
-- following the quantification operator, also extending past 'over',
-- 'changeDepth' and 'changeDepth1' functions.
--
-- However, it doesn't extend past other functions, like 'monadic', and
-- doesn't affect the operands of '==>'. Such functions start a fresh
-- default quantification context.

-- ** Examples

-- |
-- * @\\x y -> p x y@ means ∀ x, y. p x y
--
-- * @'exists' \$ \\x y -> p x y@ means ∃ x, y: p x y
--
-- * @'exists' \$ \\x -> 'forAll' \$ \\y -> p x y@ means ∃ x: ∀ y. p x y
--
-- * @'existsUnique' \$ \\x y -> p x y@ means ∃! (x, y): p x y
--
-- * @'existsUnique' \$ \\x -> 'over' s \$ \\y -> p x y@ means ∃! (x, y): y ∈ s && p x y
--
-- * @'existsUnique' \$ \\x -> 'monadic' \$ \\y -> p x y@ means ∃! x: ∀ y. [p x y]
--
-- * @'existsUnique' \$ \\x -> 'existsUnique' \$ \\y -> p x y@ means ∃! x: ∃! y: p x y
--
-- * @'exists' \$ \\x -> (\\y -> p y) '==>' (\\z -> q z)@ means ∃ x: (∀ y. p y) => (∀ z. p z)

forAll,
exists,
existsUnique,
over,

(==>),
changeDepth,
changeDepth1,

-- * Running tests
-- | 'smallCheck' is a simple way to run a test.
--
-- As an alternative, consider using the @test-framework@ package:
--
-- It allows to organize SmallCheck properties into a test suite (possibly
-- together with HUnit or QuickCheck tests), apply timeouts, get nice
-- statistics etc.
--
-- To use SmallCheck properties with test-framework, install
--
-- For more ways to run the tests, see "Test.SmallCheck.Drivers".
Depth,
smallCheck,

-- * Main types and classes
Testable,
Property,

) where

import Test.SmallCheck.Property
import Test.SmallCheck.Drivers
```