-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A property-based testing library -- -- As of 2023, this library is largely obsolete: arbitrary test -- generators with shrinking such as falsify offer much better -- user experience. -- -- SmallCheck is a testing library that allows to verify properties for -- all test cases up to some depth. The test cases are generated -- automatically by SmallCheck. @package smallcheck @version 1.2.1.1 -- | You need this module if you want to generate test values of your own -- types. -- -- You'll typically need the following extensions: -- --
-- {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
--
--
-- SmallCheck itself defines data generators for all the data types used
-- by the Prelude.
--
-- In order to generate values and functions of your own types, you need
-- to make them instances of Serial (for values) and
-- CoSerial (for functions). There are two main ways to do so:
-- using Generics or writing the instances by hand.
module Test.SmallCheck.Series
cons0 :: a -> Series m a
cons1 :: Serial m a => (a -> b) -> Series m b
cons2 :: (Serial m a, Serial m b) => (a -> b -> c) -> Series m c
cons3 :: (Serial m a, Serial m b, Serial m c) => (a -> b -> c -> d) -> Series m d
cons4 :: (Serial m a, Serial m b, Serial m c, Serial m d) => (a -> b -> c -> d -> e) -> Series m e
cons5 :: (Serial m a, Serial m b, Serial m c, Serial m d, Serial m e) => (a -> b -> c -> d -> e -> f) -> Series m f
cons6 :: (Serial m a, Serial m b, Serial m c, Serial m d, Serial m e, Serial m f) => (a -> b -> c -> d -> e -> f -> g) -> Series m g
-- | Same as cons1, but preserves the depth.
newtypeCons :: Serial m a => (a -> b) -> Series m b
alts0 :: Series m a -> Series m a
alts1 :: CoSerial m a => Series m b -> Series m (a -> b)
alts2 :: (CoSerial m a, CoSerial m b) => Series m c -> Series m (a -> b -> c)
alts3 :: (CoSerial m a, CoSerial m b, CoSerial m c) => Series m d -> Series m (a -> b -> c -> d)
alts4 :: (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d) => Series m e -> Series m (a -> b -> c -> d -> e)
alts5 :: (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d, CoSerial m e) => Series m f -> Series m (a -> b -> c -> d -> e -> f)
alts6 :: (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d, CoSerial m e, CoSerial m f) => Series m g -> Series m (a -> b -> c -> d -> e -> f -> g)
-- | Same as alts1, but preserves the depth.
newtypeAlts :: CoSerial m a => Series m b -> Series m (a -> b)
-- | Maximum depth of generated test values.
--
-- For data values, it is the depth of nested constructor applications.
--
-- For functional values, it is both the depth of nested case analysis
-- and the depth of results.
type Depth = Int
-- | Series is a MonadLogic action that enumerates values of
-- a certain type, up to some depth.
--
-- The depth bound is tracked in the Series monad and can be
-- extracted using getDepth and changed using localDepth.
--
-- To manipulate series at the lowest level you can use its Monad,
-- MonadPlus and MonadLogic instances. This module provides
-- some higher-level combinators which simplify creating series.
--
-- A proper Series should be monotonic with respect to the depth —
-- i.e. localDepth (+1) s should emit all the
-- values that s emits (and possibly some more).
--
-- It is also desirable that values of smaller depth come before the
-- values of greater depth.
data Series m a
class Monad m => Serial m a
series :: Serial m a => Series m a
series :: (Serial m a, Generic a, GSerial m (Rep a)) => Series m a
class Monad m => CoSerial m a
-- | A proper coseries implementation should pass the depth
-- unchanged to its first argument. Doing otherwise will make enumeration
-- of curried functions non-uniform in their arguments.
coseries :: CoSerial m a => Series m b -> Series m (a -> b)
-- | A proper coseries implementation should pass the depth
-- unchanged to its first argument. Doing otherwise will make enumeration
-- of curried functions non-uniform in their arguments.
coseries :: (CoSerial m a, Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b)
genericSeries :: (Monad m, Generic a, GSerial m (Rep a)) => Series m a
genericCoseries :: (Monad m, Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b)
-- | Positive x guarantees that <math>.
newtype Positive a
Positive :: a -> Positive a
[getPositive] :: Positive a -> a
-- | NonNegative x guarantees that <math>.
newtype NonNegative a
NonNegative :: a -> NonNegative a
[getNonNegative] :: NonNegative a -> a
-- | NonZero x guarantees that <math>.
newtype NonZero a
NonZero :: a -> NonZero a
[getNonZero] :: NonZero a -> a
-- | NonEmpty xs guarantees that xs is not null.
newtype NonEmpty a
NonEmpty :: [a] -> NonEmpty a
[getNonEmpty] :: NonEmpty a -> [a]
-- | Sum (union) of series.
(\/) :: Monad m => Series m a -> Series m a -> Series m a
infixr 7 \/
-- | Product of series
(><) :: Monad m => Series m a -> Series m b -> Series m (a, b)
infixr 8 ><
-- | Fair version of ap and <*>.
(<~>) :: Monad m => Series m (a -> b) -> Series m a -> Series m b
infixl 4 <~>
-- | Fair conjunction. Similarly to the previous function, consider
-- the distributivity law, naturally expected from MonadPlus:
--
-- -- (a <|> b) >>= k = (a >>= k) <|> (b >>= k) ---- -- If a >>= k can backtrack arbitrarily -- many times, b >>= k may never be -- considered. In logic statements, "backtracking" is the process of -- discarding the current possible solution value and returning to a -- previous decision point where a new value can be obtained and tried. -- For example: -- --
-- >>> do { x <- pure 0 <|> pure 1 <|> pure 2; if even x then pure x else empty } :: [Int]
-- [0,2]
--
--
-- Here, the x value can be produced three times, where
-- <|> represents the decision points of that production.
-- The subsequent if statement specifies empty (fail) if
-- x is odd, causing it to be discarded and a return to an
-- <|> decision point to get the next x.
--
-- The statement "a >>= k can backtrack
-- arbitrarily many times" means that the computation is resulting in
-- empty and that a has an infinite number of
-- <|> applications to return to. This is called a
-- conjunctive computation because the logic for a and
-- k must both succeed (i.e. pure a value instead of
-- empty).
--
-- Similar to the way interleave allows both branches of a
-- disjunctive computation, the >>- operator takes care to
-- consider both branches of a conjunctive computation.
--
-- Consider the operation:
--
-- -- odds = pure 1 <|> fmap (2 +) odds -- -- oddsPlus n = odds >>= \a -> pure (a + n) -- -- g = do x <- (pure 0 <|> pure 1) >>= oddsPlus -- if even x then pure x else empty ---- --
-- >>> observeMany 3 g -- ...never completes... ---- -- This will never produce any value because all values produced by the -- do program come from the pure 1 driven -- operation (adding one to the sequence of odd values, resulting in the -- even values that are allowed by the test in the second line), but the -- pure 0 input to oddsPlus generates an -- infinite number of empty failures so the even values generated -- by the pure 1 alternative are never seen. Using -- interleave here instead of <|> does not help due -- to the aforementioned distributivity law. -- -- Also note that the do notation desugars to >>= -- bind operations, so the following would also fail: -- --
-- do a <- pure 0 <|> pure 1 -- x <- oddsPlus a -- if even x then pure x else empty ---- -- The solution is to use the >>- in place of the normal -- monadic bind operation >>= when fairness between -- alternative productions is needed in a conjunction of statements -- (rules): -- --
-- h = do x <- (pure 0 <|> pure 1) >>- oddsPlus -- if even x then pure x else empty ---- --
-- >>> observeMany 3 h -- [2,4,6] ---- -- However, a bit of care is needed when using >>- because, -- unlike >>=, it is not associative. For example: -- --
-- >>> let m = [2,7] :: [Int] -- -- >>> let k x = [x, x + 1] -- -- >>> let h x = [x, x * 2] -- -- >>> m >>= (\x -> k x >>= h) -- [2,4,3,6,7,14,8,16] -- -- >>> (m >>= k) >>= h -- same as above -- [2,4,3,6,7,14,8,16] -- -- >>> m >>- (\x -> k x >>- h) -- [2,7,3,8,4,14,6,16] -- -- >>> (m >>- k) >>- h -- central elements are different -- [2,7,4,3,14,8,6,16] ---- -- This means that the following will be productive: -- --
-- (pure 0 <|> pure 1) >>- -- oddsPlus >>- -- \x -> if even x then pure x else empty ---- -- Which is equivalent to -- --
-- ((pure 0 <|> pure 1) >>- oddsPlus) >>- -- (\x -> if even x then pure x else empty) ---- -- But the following will not be productive: -- --
-- (pure 0 <|> pure 1) >>- -- (\a -> (oddsPlus a >>- \x -> if even x then pure x else empty)) ---- -- Since do notation desugaring results in the latter, the -- RebindableSyntax language pragma cannot easily be used -- either. Instead, it is recommended to carefully use explicit -- >>- only when needed. (>>-) :: MonadLogic m => m a -> (a -> m b) -> m b infixl 1 >>- -- | Run a series with a modified depth. localDepth :: (Depth -> Depth) -> Series m a -> Series m a -- | Run a Series with the depth decreased by 1. -- -- If the current depth is less or equal to 0, the result is -- empty. decDepth :: Series m a -> Series m a -- | Query the current depth. getDepth :: Series m Depth -- | A simple series specified by a function from depth to the list of -- values up to that depth. generate :: (Depth -> [a]) -> Series m a -- | Limit a Series to its first n elements. limit :: forall m a. Monad m => Int -> Series m a -> Series m a -- | Given a depth, return the list of values generated by a Serial -- instance. -- -- For example, list all integers up to depth 1: -- --
listSeries 1 :: [Int] -- returns [0,1,-1]
list 3 series :: [Int] -- returns -- [0,1,-1,2,-2,3,-3]
list 3 (series :: Series Identity -- Int) -- returns [0,1,-1,2,-2,3,-3]
list 2 series :: [[Bool]] -- returns -- [[],[True],[False]]
-- constM = liftM const --constM :: Monad m => m b -> m (a -> b) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.N a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Test.SmallCheck.Series.N a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Test.SmallCheck.Series.N a) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.M a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Test.SmallCheck.Series.M a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Test.SmallCheck.Series.M a) instance Data.Traversable.Traversable Test.SmallCheck.Series.Positive instance Data.Foldable.Foldable Test.SmallCheck.Series.Positive instance GHC.Base.Functor Test.SmallCheck.Series.Positive instance GHC.Classes.Ord a => GHC.Classes.Ord (Test.SmallCheck.Series.Positive a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Test.SmallCheck.Series.Positive a) instance Data.Traversable.Traversable Test.SmallCheck.Series.NonNegative instance Data.Foldable.Foldable Test.SmallCheck.Series.NonNegative instance GHC.Base.Functor Test.SmallCheck.Series.NonNegative instance GHC.Classes.Ord a => GHC.Classes.Ord (Test.SmallCheck.Series.NonNegative a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Test.SmallCheck.Series.NonNegative a) instance Data.Traversable.Traversable Test.SmallCheck.Series.NonZero instance Data.Foldable.Foldable Test.SmallCheck.Series.NonZero instance GHC.Base.Functor Test.SmallCheck.Series.NonZero instance GHC.Classes.Ord a => GHC.Classes.Ord (Test.SmallCheck.Series.NonZero a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Test.SmallCheck.Series.NonZero a) instance Test.SmallCheck.Series.Serial m a => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.NonEmpty a) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.NonEmpty a) instance GHC.Real.Real a => GHC.Real.Real (Test.SmallCheck.Series.NonZero a) instance (GHC.Classes.Eq a, GHC.Num.Num a, GHC.Enum.Bounded a) => GHC.Enum.Bounded (Test.SmallCheck.Series.NonZero a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Test.SmallCheck.Series.NonZero a) instance GHC.Num.Num a => GHC.Num.Num (Test.SmallCheck.Series.NonZero a) instance GHC.Real.Integral a => GHC.Real.Integral (Test.SmallCheck.Series.NonZero a) instance (GHC.Num.Num a, GHC.Classes.Ord a, Test.SmallCheck.Series.Serial m a) => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.NonZero a) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.NonZero a) instance GHC.Real.Real a => GHC.Real.Real (Test.SmallCheck.Series.NonNegative a) instance (GHC.Num.Num a, GHC.Enum.Bounded a) => GHC.Enum.Bounded (Test.SmallCheck.Series.NonNegative a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Test.SmallCheck.Series.NonNegative a) instance GHC.Num.Num a => GHC.Num.Num (Test.SmallCheck.Series.NonNegative a) instance GHC.Real.Integral a => GHC.Real.Integral (Test.SmallCheck.Series.NonNegative a) instance (GHC.Num.Num a, GHC.Classes.Ord a, Test.SmallCheck.Series.Serial m a) => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.NonNegative a) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.NonNegative a) instance (GHC.Real.Integral i, Test.SmallCheck.Series.Serial m i) => Test.SmallCheck.Series.Serial m (GHC.Real.Ratio i) instance GHC.Real.Real a => GHC.Real.Real (Test.SmallCheck.Series.Positive a) instance (GHC.Num.Num a, GHC.Enum.Bounded a) => GHC.Enum.Bounded (Test.SmallCheck.Series.Positive a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Test.SmallCheck.Series.Positive a) instance GHC.Num.Num a => GHC.Num.Num (Test.SmallCheck.Series.Positive a) instance GHC.Real.Integral a => GHC.Real.Integral (Test.SmallCheck.Series.Positive a) instance (GHC.Num.Num a, GHC.Classes.Ord a, Test.SmallCheck.Series.Serial m a) => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.Positive a) instance GHC.Show.Show a => GHC.Show.Show (Test.SmallCheck.Series.Positive a) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Num.Integer.Integer instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Num.Integer.Integer instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Int instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Int instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Int.Int8 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Int.Int8 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Int.Int16 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Int.Int16 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Int.Int32 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Int.Int32 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Int.Int64 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Int.Int64 instance GHC.Real.Real a => GHC.Real.Real (Test.SmallCheck.Series.M a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Test.SmallCheck.Series.M a) instance GHC.Num.Num a => GHC.Num.Num (Test.SmallCheck.Series.M a) instance GHC.Real.Integral a => GHC.Real.Integral (Test.SmallCheck.Series.M a) instance (GHC.Num.Num a, GHC.Enum.Enum a, GHC.Base.Monad m) => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.M a) instance (GHC.Classes.Ord a, GHC.Num.Num a, GHC.Base.Monad m) => Test.SmallCheck.Series.CoSerial m (Test.SmallCheck.Series.M a) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Num.Natural.Natural instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Num.Natural.Natural instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Word instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Word instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Word.Word8 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Word.Word8 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Word.Word16 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Word.Word16 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Word.Word32 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Word.Word32 instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Word.Word64 instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Word.Word64 instance GHC.Real.Real a => GHC.Real.Real (Test.SmallCheck.Series.N a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Test.SmallCheck.Series.N a) instance GHC.Num.Num a => GHC.Num.Num (Test.SmallCheck.Series.N a) instance GHC.Real.Integral a => GHC.Real.Integral (Test.SmallCheck.Series.N a) instance (GHC.Num.Num a, GHC.Enum.Enum a, Test.SmallCheck.Series.Serial m a) => Test.SmallCheck.Series.Serial m (Test.SmallCheck.Series.N a) instance (GHC.Real.Integral a, GHC.Base.Monad m) => Test.SmallCheck.Series.CoSerial m (Test.SmallCheck.Series.N a) instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Char instance Test.SmallCheck.Series.CoSerial m c => Test.SmallCheck.Series.GCoSerial m (GHC.Generics.K1 i c) instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m () instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Float instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Double instance (GHC.Real.Integral i, Test.SmallCheck.Series.CoSerial m i) => Test.SmallCheck.Series.CoSerial m (GHC.Real.Ratio i) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b) => Test.SmallCheck.Series.CoSerial m (a, b) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b, Test.SmallCheck.Series.CoSerial m c) => Test.SmallCheck.Series.CoSerial m (a, b, c) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b, Test.SmallCheck.Series.CoSerial m c, Test.SmallCheck.Series.CoSerial m d) => Test.SmallCheck.Series.CoSerial m (a, b, c, d) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b, Test.SmallCheck.Series.CoSerial m c, Test.SmallCheck.Series.CoSerial m d, Test.SmallCheck.Series.CoSerial m e) => Test.SmallCheck.Series.CoSerial m (a, b, c, d, e) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b, Test.SmallCheck.Series.CoSerial m c, Test.SmallCheck.Series.CoSerial m d, Test.SmallCheck.Series.CoSerial m e, Test.SmallCheck.Series.CoSerial m f) => Test.SmallCheck.Series.CoSerial m (a, b, c, d, e, f) instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Bool instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m GHC.Types.Ordering instance Test.SmallCheck.Series.CoSerial m a => Test.SmallCheck.Series.CoSerial m (GHC.Maybe.Maybe a) instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.CoSerial m b) => Test.SmallCheck.Series.CoSerial m (Data.Either.Either a b) instance Test.SmallCheck.Series.CoSerial m a => Test.SmallCheck.Series.CoSerial m [a] instance Test.SmallCheck.Series.CoSerial m a => Test.SmallCheck.Series.CoSerial m (GHC.Base.NonEmpty a) instance Test.SmallCheck.Series.CoSerial m a => Test.SmallCheck.Series.CoSerial m (Data.Complex.Complex a) instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Data.Void.Void instance (Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.Serial m b) => Test.SmallCheck.Series.Serial m (a -> b) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.CoSerial m a, Test.SmallCheck.Series.Serial m b, Test.SmallCheck.Series.CoSerial m b) => Test.SmallCheck.Series.CoSerial m (a -> b) instance (GHC.Base.Monad m, Test.SmallCheck.Series.CoSerial m (f (g a))) => Test.SmallCheck.Series.CoSerial m (Data.Functor.Compose.Compose f g a) instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CFloat instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CDouble instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CBool instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CChar instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CSChar instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUChar instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CShort instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUShort instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CInt instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUInt instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CLong instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CULong instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CPtrdiff instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CSize instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CWchar instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CSigAtomic instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CLLong instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CULLong instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CIntPtr instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUIntPtr instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CIntMax instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUIntMax instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CClock instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CTime instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CUSeconds instance GHC.Base.Monad m => Test.SmallCheck.Series.CoSerial m Foreign.C.Types.CSUSeconds instance Test.SmallCheck.Series.GCoSerial m f => Test.SmallCheck.Series.GCoSerial m (GHC.Generics.M1 i c f) instance Test.SmallCheck.Series.GCoSerial m GHC.Generics.U1 instance Test.SmallCheck.Series.GCoSerial m GHC.Generics.V1 instance (GHC.Base.Monad m, Test.SmallCheck.Series.GCoSerial m a, Test.SmallCheck.Series.GCoSerial m b) => Test.SmallCheck.Series.GCoSerial m (a GHC.Generics.:*: b) instance (GHC.Base.Monad m, Test.SmallCheck.Series.GCoSerial m a, Test.SmallCheck.Series.GCoSerial m b) => Test.SmallCheck.Series.GCoSerial m (a GHC.Generics.:+: b) instance Test.SmallCheck.Series.Serial m c => Test.SmallCheck.Series.GSerial m (GHC.Generics.K1 i c) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m () instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Float instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Double instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Char instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b) => Test.SmallCheck.Series.Serial m (a, b) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b, Test.SmallCheck.Series.Serial m c) => Test.SmallCheck.Series.Serial m (a, b, c) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b, Test.SmallCheck.Series.Serial m c, Test.SmallCheck.Series.Serial m d) => Test.SmallCheck.Series.Serial m (a, b, c, d) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b, Test.SmallCheck.Series.Serial m c, Test.SmallCheck.Series.Serial m d, Test.SmallCheck.Series.Serial m e) => Test.SmallCheck.Series.Serial m (a, b, c, d, e) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b, Test.SmallCheck.Series.Serial m c, Test.SmallCheck.Series.Serial m d, Test.SmallCheck.Series.Serial m e, Test.SmallCheck.Series.Serial m f) => Test.SmallCheck.Series.Serial m (a, b, c, d, e, f) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Bool instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m GHC.Types.Ordering instance Test.SmallCheck.Series.Serial m a => Test.SmallCheck.Series.Serial m (GHC.Maybe.Maybe a) instance (Test.SmallCheck.Series.Serial m a, Test.SmallCheck.Series.Serial m b) => Test.SmallCheck.Series.Serial m (Data.Either.Either a b) instance Test.SmallCheck.Series.Serial m a => Test.SmallCheck.Series.Serial m [a] instance Test.SmallCheck.Series.Serial m a => Test.SmallCheck.Series.Serial m (GHC.Base.NonEmpty a) instance Test.SmallCheck.Series.Serial m a => Test.SmallCheck.Series.Serial m (Data.Complex.Complex a) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Data.Void.Void instance (Test.SmallCheck.Series.Serial Data.Functor.Identity.Identity a, GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (a -> b) instance (GHC.Base.Monad m, Test.SmallCheck.Series.Serial m (f (g a))) => Test.SmallCheck.Series.Serial m (Data.Functor.Compose.Compose f g a) instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CFloat instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CDouble instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CBool instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CChar instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CSChar instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUChar instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CShort instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUShort instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CInt instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUInt instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CLong instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CULong instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CPtrdiff instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CSize instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CWchar instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CSigAtomic instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CLLong instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CULLong instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CIntPtr instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUIntPtr instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CIntMax instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUIntMax instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CClock instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CTime instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CUSeconds instance GHC.Base.Monad m => Test.SmallCheck.Series.Serial m Foreign.C.Types.CSUSeconds instance Test.SmallCheck.Series.GSerial m f => Test.SmallCheck.Series.GSerial m (GHC.Generics.M1 i c f) instance Test.SmallCheck.Series.GSerial m GHC.Generics.U1 instance Test.SmallCheck.Series.GSerial m GHC.Generics.V1 instance (GHC.Base.Monad m, Test.SmallCheck.Series.GSerial m a, Test.SmallCheck.Series.GSerial m b) => Test.SmallCheck.Series.GSerial m (a GHC.Generics.:*: b) instance (GHC.Base.Monad m, Test.SmallCheck.Series.GSerial m a, Test.SmallCheck.Series.GSerial m b) => Test.SmallCheck.Series.GSerial m (a GHC.Generics.:+: b) instance Test.SmallCheck.Series.GSerial m f => Test.SmallCheck.Series.GSerial m (GHC.Generics.C1 c f) -- | You should only need this module if you wish to create your own way to -- run SmallCheck tests module Test.SmallCheck.Drivers -- | A simple driver that runs the test in the IO monad and prints -- the results. smallCheck :: Testable IO a => Depth -> a -> IO () -- | Use this if: -- --