smallcheck-1.2.1.1: A property-based testing library
Copyright(c) Colin Runciman et al.
LicenseBSD3
MaintainerRoman Cheplyaka <roma@ro-che.info>
Safe HaskellSafe
LanguageHaskell2010

Test.SmallCheck.Series

Description

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.

Synopsis

Generic instances

The easiest way to create the necessary instances is to use GHC generics (available starting with GHC 7.2.1).

Here's a complete example:

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# LANGUAGE DeriveGeneric #-}

import Test.SmallCheck.Series
import GHC.Generics

data Tree a = Null | Fork (Tree a) a (Tree a)
    deriving Generic

instance Serial m a => Serial m (Tree a)

Here we enable the DeriveGeneric extension which allows to derive Generic instance for our data type. Then we declare that Tree a is an instance of Serial, but do not provide any definitions. This causes GHC to use the default definitions that use the Generic instance.

One minor limitation of generic instances is that there's currently no way to distinguish newtypes and datatypes. Thus, newtype constructors will also count as one level of depth.

Data Generators

Writing Serial instances for application-specific types is straightforward. You need to define a series generator, typically using consN family of generic combinators where N is constructor arity.

For example:

data Tree a = Null | Fork (Tree a) a (Tree a)

instance Serial m a => Serial m (Tree a) where
  series = cons0 Null \/ cons3 Fork

For newtypes use newtypeCons instead of cons1. The difference is that cons1 is counts as one level of depth, while newtypeCons doesn't affect the depth.

newtype Light a = Light a

instance Serial m a => Serial m (Light a) where
  series = newtypeCons Light

For data types with more than 6 fields define consN as

consN f = decDepth $
  f <$> series
    <~> series
    <~> series
    <~> ...    {- series repeated N times in total -}

What does consN do, exactly?

consN has type (Serial t₁, ..., Serial tₙ) => (t₁ -> ... -> tₙ -> t) -> Series t.

consN f is a series which, for a given depth \(d > 0\), produces values of the form

f x₁ ... xₙ

where xₖ ranges over all values of type tₖ of depth up to \(d-1\) (as defined by the series functions for tₖ).

consN functions also ensure that xₖ are enumerated in the breadth-first order. Thus, combinations of smaller depth come first (assuming the same is true for tₖ).

If \(d \le 0\), no values are produced.

cons0 :: a -> Series m a Source #

Since: 1.0

cons1 :: Serial m a => (a -> b) -> Series m b Source #

Since: 1.0

cons2 :: (Serial m a, Serial m b) => (a -> b -> c) -> Series m c Source #

Since: 1.0

cons3 :: (Serial m a, Serial m b, Serial m c) => (a -> b -> c -> d) -> Series m d Source #

Since: 1.0

cons4 :: (Serial m a, Serial m b, Serial m c, Serial m d) => (a -> b -> c -> d -> e) -> Series m e Source #

Since: 1.0

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 Source #

Since: 1.2.0

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 Source #

Since: 1.2.0

newtypeCons :: Serial m a => (a -> b) -> Series m b Source #

Same as cons1, but preserves the depth.

Since: 1.0

Function Generators

To generate functions of an application-specific argument type, make the type an instance of CoSerial.

Again there is a standard pattern, this time using the altsN combinators where again N is constructor arity. Here are Tree and Light instances:

instance CoSerial m a => CoSerial m (Tree a) where
  coseries rs =
    alts0 rs >>- \z ->
    alts3 rs >>- \f ->
    return $ \t ->
      case t of
        Null -> z
        Fork t1 x t2 -> f t1 x t2
instance CoSerial m a => CoSerial m (Light a) where
  coseries rs =
    newtypeAlts rs >>- \f ->
    return $ \l ->
      case l of
        Light x -> f x

For data types with more than 6 fields define altsN as

altsN rs = do
  rs <- fixDepth rs
  decDepthChecked
    (constM $ constM $ ... $ constM rs)
    (coseries $ coseries $ ... $ coseries rs)
    {- constM and coseries are repeated N times each -}

What does altsN do, exactly?

altsN has type (Serial t₁, ..., Serial tₙ) => Series t -> Series (t₁ -> ... -> tₙ -> t).

altsN s is a series which, for a given depth \( d \), produces functions of type

t₁ -> ... -> tₙ -> t

If \( d \le 0 \), these are constant functions, one for each value produced by s.

If \( d > 0 \), these functions inspect each of their arguments up to the depth \( d-1 \) (as defined by the coseries functions for the corresponding types) and return values produced by s. The depth to which the values are enumerated does not depend on the depth of inspection.

alts0 :: Series m a -> Series m a Source #

Since: 1.0

alts1 :: CoSerial m a => Series m b -> Series m (a -> b) Source #

Since: 1.0

alts2 :: (CoSerial m a, CoSerial m b) => Series m c -> Series m (a -> b -> c) Source #

Since: 1.0

alts3 :: (CoSerial m a, CoSerial m b, CoSerial m c) => Series m d -> Series m (a -> b -> c -> d) Source #

Since: 1.0

alts4 :: (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d) => Series m e -> Series m (a -> b -> c -> d -> e) Source #

Since: 1.0

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) Source #

Since: 1.2.0

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) Source #

Since: 1.2.0

newtypeAlts :: CoSerial m a => Series m b -> Series m (a -> b) Source #

Same as alts1, but preserves the depth.

Since: 1.0

Basic definitions

type Depth = Int Source #

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.

Since: 0.6

data Series m a Source #

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.

Since: 1.0

Instances

Instances details
MonadTrans Series Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

lift :: Monad m => m a -> Series m a #

Alternative (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

empty :: Series m a #

(<|>) :: Series m a -> Series m a -> Series m a #

some :: Series m a -> Series m [a] #

many :: Series m a -> Series m [a] #

Applicative (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

pure :: a -> Series m a #

(<*>) :: Series m (a -> b) -> Series m a -> Series m b #

liftA2 :: (a -> b -> c) -> Series m a -> Series m b -> Series m c #

(*>) :: Series m a -> Series m b -> Series m b #

(<*) :: Series m a -> Series m b -> Series m a #

Functor (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

fmap :: (a -> b) -> Series m a -> Series m b #

(<$) :: a -> Series m b -> Series m a #

Monad (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

(>>=) :: Series m a -> (a -> Series m b) -> Series m b #

(>>) :: Series m a -> Series m b -> Series m b #

return :: a -> Series m a #

MonadPlus (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

mzero :: Series m a #

mplus :: Series m a -> Series m a -> Series m a #

Monad m => MonadLogic (Series m) Source # 
Instance details

Defined in Test.SmallCheck.SeriesMonad

Methods

msplit :: Series m a -> Series m (Maybe (a, Series m a)) #

interleave :: Series m a -> Series m a -> Series m a #

(>>-) :: Series m a -> (a -> Series m b) -> Series m b #

once :: Series m a -> Series m a #

lnot :: Series m a -> Series m () #

ifte :: Series m a -> (a -> Series m b) -> Series m b -> Series m b #

class Monad m => Serial m a where Source #

Since: 1.0

Minimal complete definition

Nothing

Methods

series :: Series m a Source #

default series :: (Generic a, GSerial m (Rep a)) => Series m a Source #

Instances

Instances details
Monad m => Serial m Void Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Void Source #

Monad m => Serial m CBool Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CBool Source #

Monad m => Serial m CChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CChar Source #

Monad m => Serial m CClock Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CDouble Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CFloat Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CInt Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CInt Source #

Monad m => Serial m CIntMax Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CIntPtr Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CLLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CLong Source #

Monad m => Serial m CPtrdiff Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CSChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CSUSeconds Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CShort Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CSigAtomic Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CSize Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CSize Source #

Monad m => Serial m CTime Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CTime Source #

Monad m => Serial m CUChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CUInt Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m CUInt Source #

Monad m => Serial m CUIntMax Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CUIntPtr Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CULLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CULong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CUSeconds Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CUShort Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m CWchar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Int16 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Int16 Source #

Monad m => Serial m Int32 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Int32 Source #

Monad m => Serial m Int64 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Int64 Source #

Monad m => Serial m Int8 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Int8 Source #

Monad m => Serial m Word16 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Word32 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Word64 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Word8 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Word8 Source #

Monad m => Serial m Ordering Source #

Since: 1.2.1

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Integer Source # 
Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Natural Source #

Since: 1.1.3

Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m () Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m () Source #

Monad m => Serial m Bool Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Bool Source #

Monad m => Serial m Char Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Char Source #

Monad m => Serial m Double Source # 
Instance details

Defined in Test.SmallCheck.Series

Monad m => Serial m Float Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Float Source #

Monad m => Serial m Int Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Int Source #

Monad m => Serial m Word Source #

Since: 1.1.3

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m Word Source #

Serial m a => Serial m (Complex a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Complex a) Source #

(Integral i, Serial m i) => Serial m (Ratio i) Source #

Since: 1.1

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Ratio i) Source #

Serial m a => Serial m (NonEmpty a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonEmpty a) Source #

(Num a, Ord a, Serial m a) => Serial m (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonNegative a) Source #

(Num a, Ord a, Serial m a) => Serial m (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonZero a) Source #

(Num a, Ord a, Serial m a) => Serial m (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Positive a) Source #

Serial m a => Serial m (NonEmpty a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonEmpty a) Source #

Serial m a => Serial m (Maybe a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Maybe a) Source #

Serial m a => Serial m [a] Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m [a] Source #

(Serial m a, Serial m b) => Serial m (Either a b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Either a b) Source #

(CoSerial m a, Serial m b) => Serial m (a -> b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a -> b) Source #

(Serial m a, Serial m b) => Serial m (a, b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a, b) Source #

(Serial m a, Serial m b, Serial m c) => Serial m (a, b, c) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a, b, c) Source #

(Serial m a, Serial m b, Serial m c, Serial m d) => Serial m (a, b, c, d) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a, b, c, d) Source #

(Monad m, Serial m (f (g a))) => Serial m (Compose f g a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Compose f g a) Source #

(Serial m a, Serial m b, Serial m c, Serial m d, Serial m e) => Serial m (a, b, c, d, e) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a, b, c, d, e) Source #

(Serial m a, Serial m b, Serial m c, Serial m d, Serial m e, Serial m f) => Serial m (a, b, c, d, e, f) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (a, b, c, d, e, f) Source #

class Monad m => CoSerial m a where Source #

Since: 1.0

Minimal complete definition

Nothing

Methods

coseries :: Series m b -> Series m (a -> b) Source #

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.

default coseries :: (Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b) Source #

Instances

Instances details
Monad m => CoSerial m Void Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Void -> b) Source #

Monad m => CoSerial m CBool Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CBool -> b) Source #

Monad m => CoSerial m CChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CChar -> b) Source #

Monad m => CoSerial m CClock Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CClock -> b) Source #

Monad m => CoSerial m CDouble Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CDouble -> b) Source #

Monad m => CoSerial m CFloat Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CFloat -> b) Source #

Monad m => CoSerial m CInt Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CInt -> b) Source #

Monad m => CoSerial m CIntMax Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CIntMax -> b) Source #

Monad m => CoSerial m CIntPtr Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CIntPtr -> b) Source #

Monad m => CoSerial m CLLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CLLong -> b) Source #

Monad m => CoSerial m CLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CLong -> b) Source #

Monad m => CoSerial m CPtrdiff Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CPtrdiff -> b) Source #

Monad m => CoSerial m CSChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CSChar -> b) Source #

Monad m => CoSerial m CSUSeconds Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CSUSeconds -> b) Source #

Monad m => CoSerial m CShort Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CShort -> b) Source #

Monad m => CoSerial m CSigAtomic Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CSigAtomic -> b) Source #

Monad m => CoSerial m CSize Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CSize -> b) Source #

Monad m => CoSerial m CTime Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CTime -> b) Source #

Monad m => CoSerial m CUChar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUChar -> b) Source #

Monad m => CoSerial m CUInt Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUInt -> b) Source #

Monad m => CoSerial m CUIntMax Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUIntMax -> b) Source #

Monad m => CoSerial m CUIntPtr Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUIntPtr -> b) Source #

Monad m => CoSerial m CULLong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CULLong -> b) Source #

Monad m => CoSerial m CULong Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CULong -> b) Source #

Monad m => CoSerial m CUSeconds Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUSeconds -> b) Source #

Monad m => CoSerial m CUShort Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CUShort -> b) Source #

Monad m => CoSerial m CWchar Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (CWchar -> b) Source #

Monad m => CoSerial m Int16 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Int16 -> b) Source #

Monad m => CoSerial m Int32 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Int32 -> b) Source #

Monad m => CoSerial m Int64 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Int64 -> b) Source #

Monad m => CoSerial m Int8 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Int8 -> b) Source #

Monad m => CoSerial m Word16 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Word16 -> b) Source #

Monad m => CoSerial m Word32 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Word32 -> b) Source #

Monad m => CoSerial m Word64 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Word64 -> b) Source #

Monad m => CoSerial m Word8 Source #

Since: 1.1.4

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Word8 -> b) Source #

Monad m => CoSerial m Ordering Source #

Since: 1.2.1

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Ordering -> b) Source #

Monad m => CoSerial m Integer Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Integer -> b) Source #

Monad m => CoSerial m Natural Source #

Since: 1.1.3

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Natural -> b) Source #

Monad m => CoSerial m () Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (() -> b) Source #

Monad m => CoSerial m Bool Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Bool -> b) Source #

Monad m => CoSerial m Char Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Char -> b) Source #

Monad m => CoSerial m Double Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Double -> b) Source #

Monad m => CoSerial m Float Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Float -> b) Source #

Monad m => CoSerial m Int Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Int -> b) Source #

Monad m => CoSerial m Word Source #

Since: 1.1.3

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Word -> b) Source #

CoSerial m a => CoSerial m (Complex a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Complex a -> b) Source #

(Integral i, CoSerial m i) => CoSerial m (Ratio i) Source #

Since: 1.1

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Ratio i -> b) Source #

CoSerial m a => CoSerial m (NonEmpty a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (NonEmpty a -> b) Source #

CoSerial m a => CoSerial m (Maybe a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Maybe a -> b) Source #

CoSerial m a => CoSerial m [a] Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m ([a] -> b) Source #

(CoSerial m a, CoSerial m b) => CoSerial m (Either a b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m (Either a b -> b0) Source #

(Serial m a, CoSerial m a, Serial m b, CoSerial m b) => CoSerial m (a -> b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a -> b) -> b0) Source #

(CoSerial m a, CoSerial m b) => CoSerial m (a, b) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a, b) -> b0) Source #

(CoSerial m a, CoSerial m b, CoSerial m c) => CoSerial m (a, b, c) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a, b, c) -> b0) Source #

(CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d) => CoSerial m (a, b, c, d) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a, b, c, d) -> b0) Source #

(Monad m, CoSerial m (f (g a))) => CoSerial m (Compose f g a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b -> Series m (Compose f g a -> b) Source #

(CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d, CoSerial m e) => CoSerial m (a, b, c, d, e) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a, b, c, d, e) -> b0) Source #

(CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d, CoSerial m e, CoSerial m f) => CoSerial m (a, b, c, d, e, f) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

coseries :: Series m b0 -> Series m ((a, b, c, d, e, f) -> b0) Source #

Generic implementations

genericSeries :: (Monad m, Generic a, GSerial m (Rep a)) => Series m a Source #

Since: 1.1.5

genericCoseries :: (Monad m, Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b) Source #

Since: 1.1.5

Convenient wrappers

newtype Positive a Source #

Positive x guarantees that \( x > 0 \).

Since: 1.0

Constructors

Positive 

Fields

Instances

Instances details
Foldable Positive Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

fold :: Monoid m => Positive m -> m #

foldMap :: Monoid m => (a -> m) -> Positive a -> m #

foldMap' :: Monoid m => (a -> m) -> Positive a -> m #

foldr :: (a -> b -> b) -> b -> Positive a -> b #

foldr' :: (a -> b -> b) -> b -> Positive a -> b #

foldl :: (b -> a -> b) -> b -> Positive a -> b #

foldl' :: (b -> a -> b) -> b -> Positive a -> b #

foldr1 :: (a -> a -> a) -> Positive a -> a #

foldl1 :: (a -> a -> a) -> Positive a -> a #

toList :: Positive a -> [a] #

null :: Positive a -> Bool #

length :: Positive a -> Int #

elem :: Eq a => a -> Positive a -> Bool #

maximum :: Ord a => Positive a -> a #

minimum :: Ord a => Positive a -> a #

sum :: Num a => Positive a -> a #

product :: Num a => Positive a -> a #

Traversable Positive Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

traverse :: Applicative f => (a -> f b) -> Positive a -> f (Positive b) #

sequenceA :: Applicative f => Positive (f a) -> f (Positive a) #

mapM :: Monad m => (a -> m b) -> Positive a -> m (Positive b) #

sequence :: Monad m => Positive (m a) -> m (Positive a) #

Functor Positive Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

fmap :: (a -> b) -> Positive a -> Positive b #

(<$) :: a -> Positive b -> Positive a #

(Num a, Ord a, Serial m a) => Serial m (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (Positive a) Source #

(Num a, Bounded a) => Bounded (Positive a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Enum a => Enum (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Num a => Num (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Integral a => Integral (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Real a => Real (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

toRational :: Positive a -> Rational #

Show a => Show (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

showsPrec :: Int -> Positive a -> ShowS #

show :: Positive a -> String #

showList :: [Positive a] -> ShowS #

Eq a => Eq (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

(==) :: Positive a -> Positive a -> Bool #

(/=) :: Positive a -> Positive a -> Bool #

Ord a => Ord (Positive a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

compare :: Positive a -> Positive a -> Ordering #

(<) :: Positive a -> Positive a -> Bool #

(<=) :: Positive a -> Positive a -> Bool #

(>) :: Positive a -> Positive a -> Bool #

(>=) :: Positive a -> Positive a -> Bool #

max :: Positive a -> Positive a -> Positive a #

min :: Positive a -> Positive a -> Positive a #

newtype NonNegative a Source #

NonNegative x guarantees that \( x \ge 0 \).

Since: 1.0

Constructors

NonNegative 

Fields

Instances

Instances details
Foldable NonNegative Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

fold :: Monoid m => NonNegative m -> m #

foldMap :: Monoid m => (a -> m) -> NonNegative a -> m #

foldMap' :: Monoid m => (a -> m) -> NonNegative a -> m #

foldr :: (a -> b -> b) -> b -> NonNegative a -> b #

foldr' :: (a -> b -> b) -> b -> NonNegative a -> b #

foldl :: (b -> a -> b) -> b -> NonNegative a -> b #

foldl' :: (b -> a -> b) -> b -> NonNegative a -> b #

foldr1 :: (a -> a -> a) -> NonNegative a -> a #

foldl1 :: (a -> a -> a) -> NonNegative a -> a #

toList :: NonNegative a -> [a] #

null :: NonNegative a -> Bool #

length :: NonNegative a -> Int #

elem :: Eq a => a -> NonNegative a -> Bool #

maximum :: Ord a => NonNegative a -> a #

minimum :: Ord a => NonNegative a -> a #

sum :: Num a => NonNegative a -> a #

product :: Num a => NonNegative a -> a #

Traversable NonNegative Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

traverse :: Applicative f => (a -> f b) -> NonNegative a -> f (NonNegative b) #

sequenceA :: Applicative f => NonNegative (f a) -> f (NonNegative a) #

mapM :: Monad m => (a -> m b) -> NonNegative a -> m (NonNegative b) #

sequence :: Monad m => NonNegative (m a) -> m (NonNegative a) #

Functor NonNegative Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Methods

fmap :: (a -> b) -> NonNegative a -> NonNegative b #

(<$) :: a -> NonNegative b -> NonNegative a #

(Num a, Ord a, Serial m a) => Serial m (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonNegative a) Source #

(Num a, Bounded a) => Bounded (NonNegative a) Source #

Since: 1.2.0

Instance details

Defined in Test.SmallCheck.Series

Enum a => Enum (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Num a => Num (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Integral a => Integral (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Real a => Real (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Show a => Show (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Eq a => Eq (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Ord a => Ord (NonNegative a) Source # 
Instance details

Defined in Test.SmallCheck.Series

newtype NonZero a Source #

NonZero x guarantees that \( x \ne 0 \).

Since: 1.2.0

Constructors

NonZero 

Fields

Instances

Instances details
Foldable NonZero Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

fold :: Monoid m => NonZero m -> m #

foldMap :: Monoid m => (a -> m) -> NonZero a -> m #

foldMap' :: Monoid m => (a -> m) -> NonZero a -> m #

foldr :: (a -> b -> b) -> b -> NonZero a -> b #

foldr' :: (a -> b -> b) -> b -> NonZero a -> b #

foldl :: (b -> a -> b) -> b -> NonZero a -> b #

foldl' :: (b -> a -> b) -> b -> NonZero a -> b #

foldr1 :: (a -> a -> a) -> NonZero a -> a #

foldl1 :: (a -> a -> a) -> NonZero a -> a #

toList :: NonZero a -> [a] #

null :: NonZero a -> Bool #

length :: NonZero a -> Int #

elem :: Eq a => a -> NonZero a -> Bool #

maximum :: Ord a => NonZero a -> a #

minimum :: Ord a => NonZero a -> a #

sum :: Num a => NonZero a -> a #

product :: Num a => NonZero a -> a #

Traversable NonZero Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

traverse :: Applicative f => (a -> f b) -> NonZero a -> f (NonZero b) #

sequenceA :: Applicative f => NonZero (f a) -> f (NonZero a) #

mapM :: Monad m => (a -> m b) -> NonZero a -> m (NonZero b) #

sequence :: Monad m => NonZero (m a) -> m (NonZero a) #

Functor NonZero Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

fmap :: (a -> b) -> NonZero a -> NonZero b #

(<$) :: a -> NonZero b -> NonZero a #

(Num a, Ord a, Serial m a) => Serial m (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonZero a) Source #

(Eq a, Num a, Bounded a) => Bounded (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Enum a => Enum (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

succ :: NonZero a -> NonZero a #

pred :: NonZero a -> NonZero a #

toEnum :: Int -> NonZero a #

fromEnum :: NonZero a -> Int #

enumFrom :: NonZero a -> [NonZero a] #

enumFromThen :: NonZero a -> NonZero a -> [NonZero a] #

enumFromTo :: NonZero a -> NonZero a -> [NonZero a] #

enumFromThenTo :: NonZero a -> NonZero a -> NonZero a -> [NonZero a] #

Num a => Num (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

(+) :: NonZero a -> NonZero a -> NonZero a #

(-) :: NonZero a -> NonZero a -> NonZero a #

(*) :: NonZero a -> NonZero a -> NonZero a #

negate :: NonZero a -> NonZero a #

abs :: NonZero a -> NonZero a #

signum :: NonZero a -> NonZero a #

fromInteger :: Integer -> NonZero a #

Integral a => Integral (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

quot :: NonZero a -> NonZero a -> NonZero a #

rem :: NonZero a -> NonZero a -> NonZero a #

div :: NonZero a -> NonZero a -> NonZero a #

mod :: NonZero a -> NonZero a -> NonZero a #

quotRem :: NonZero a -> NonZero a -> (NonZero a, NonZero a) #

divMod :: NonZero a -> NonZero a -> (NonZero a, NonZero a) #

toInteger :: NonZero a -> Integer #

Real a => Real (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

toRational :: NonZero a -> Rational #

Show a => Show (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

showsPrec :: Int -> NonZero a -> ShowS #

show :: NonZero a -> String #

showList :: [NonZero a] -> ShowS #

Eq a => Eq (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

(==) :: NonZero a -> NonZero a -> Bool #

(/=) :: NonZero a -> NonZero a -> Bool #

Ord a => Ord (NonZero a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

compare :: NonZero a -> NonZero a -> Ordering #

(<) :: NonZero a -> NonZero a -> Bool #

(<=) :: NonZero a -> NonZero a -> Bool #

(>) :: NonZero a -> NonZero a -> Bool #

(>=) :: NonZero a -> NonZero a -> Bool #

max :: NonZero a -> NonZero a -> NonZero a #

min :: NonZero a -> NonZero a -> NonZero a #

newtype NonEmpty a Source #

NonEmpty xs guarantees that xs is not null.

Since: 1.1

Constructors

NonEmpty 

Fields

Instances

Instances details
Serial m a => Serial m (NonEmpty a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

series :: Series m (NonEmpty a) Source #

Show a => Show (NonEmpty a) Source # 
Instance details

Defined in Test.SmallCheck.Series

Methods

showsPrec :: Int -> NonEmpty a -> ShowS #

show :: NonEmpty a -> String #

showList :: [NonEmpty a] -> ShowS #

Other useful definitions

(\/) :: Monad m => Series m a -> Series m a -> Series m a infixr 7 Source #

Sum (union) of series.

Since: 1.0

(><) :: Monad m => Series m a -> Series m b -> Series m (a, b) infixr 8 Source #

Product of series

Since: 1.0

(<~>) :: Monad m => Series m (a -> b) -> Series m a -> Series m b infixl 4 Source #

Fair version of ap and <*>.

Since: 1.0

(>>-) :: MonadLogic m => m a -> (a -> m b) -> m b infixl 1 #

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.

localDepth :: (Depth -> Depth) -> Series m a -> Series m a Source #

Run a series with a modified depth.

Since: 1.0

decDepth :: Series m a -> Series m a Source #

Run a Series with the depth decreased by 1.

If the current depth is less or equal to 0, the result is empty.

Since: 1.0

getDepth :: Series m Depth Source #

Query the current depth.

Since: 1.0

generate :: (Depth -> [a]) -> Series m a Source #

A simple series specified by a function from depth to the list of values up to that depth.

Since: 1.0

limit :: forall m a. Monad m => Int -> Series m a -> Series m a Source #

Limit a Series to its first n elements.

Since: 1.1.5

listSeries :: Serial Identity a => Depth -> [a] Source #

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]

Since: 1.1.2

list :: Depth -> Series Identity a -> [a] Source #

Return the list of values generated by a Series. Useful for debugging Serial instances.

Examples:

The first two are equivalent. The second has a more explicit type binding.

Since: 1.0

listM :: Applicative m => Depth -> Series m a -> m [a] Source #

Monadic version of list.

Since: 1.1

fixDepth :: Series m a -> Series m (Series m a) Source #

Fix the depth of a series at the current level. The resulting series will no longer depend on the "ambient" depth.

Since: 1.1.1

decDepthChecked :: Series m a -> Series m a -> Series m a Source #

If the current depth is 0, evaluate the first argument. Otherwise, evaluate the second argument with decremented depth.

Since: 1.1.1

constM :: Monad m => m b -> m (a -> b) Source #

constM = liftM const

Since: 1.1.1

Orphan instances

(Serial Identity a, Show a, Show b) => Show (a -> b) Source # 
Instance details

Methods

showsPrec :: Int -> (a -> b) -> ShowS #

show :: (a -> b) -> String #

showList :: [a -> b] -> ShowS #