| Copyright | (c) Colin Runciman et al. |
|---|---|
| License | BSD3 |
| Maintainer | Roman Cheplyaka <roma@ro-che.info> |
| Safe Haskell | Safe |
| Language | Haskell2010 |
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
- cons0 :: forall a (m :: Type -> Type). a -> Series m a
- cons1 :: forall (m :: Type -> Type) a b. Serial m a => (a -> b) -> Series m b
- cons2 :: forall (m :: Type -> Type) a b c. (Serial m a, Serial m b) => (a -> b -> c) -> Series m c
- cons3 :: forall (m :: Type -> Type) a b c d. (Serial m a, Serial m b, Serial m c) => (a -> b -> c -> d) -> Series m d
- cons4 :: forall (m :: Type -> Type) a b c d e. (Serial m a, Serial m b, Serial m c, Serial m d) => (a -> b -> c -> d -> e) -> Series m e
- cons5 :: forall (m :: Type -> Type) a b c d e f. (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 :: forall (m :: Type -> Type) a b c d e f g. (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
- newtypeCons :: forall (m :: Type -> Type) a b. Serial m a => (a -> b) -> Series m b
- alts0 :: forall (m :: Type -> Type) a. Series m a -> Series m a
- alts1 :: forall (m :: Type -> Type) a b. CoSerial m a => Series m b -> Series m (a -> b)
- alts2 :: forall (m :: Type -> Type) a b c. (CoSerial m a, CoSerial m b) => Series m c -> Series m (a -> b -> c)
- alts3 :: forall (m :: Type -> Type) a b c d. (CoSerial m a, CoSerial m b, CoSerial m c) => Series m d -> Series m (a -> b -> c -> d)
- alts4 :: forall (m :: Type -> Type) a b c d e. (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d) => Series m e -> Series m (a -> b -> c -> d -> e)
- alts5 :: forall (m :: Type -> Type) a b c d e f. (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 :: forall (m :: Type -> Type) a b c d e f g. (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)
- newtypeAlts :: forall (m :: Type -> Type) a b. CoSerial m a => Series m b -> Series m (a -> b)
- type Depth = Int
- data Series (m :: Type -> Type) a
- class Monad m => Serial (m :: Type -> Type) a where
- class Monad m => CoSerial (m :: Type -> Type) a where
- genericSeries :: forall (m :: Type -> Type) a. (Monad m, Generic a, GSerial m (Rep a)) => Series m a
- genericCoseries :: forall (m :: Type -> Type) a b. (Monad m, Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b)
- newtype Positive a = Positive {
- getPositive :: a
- newtype NonNegative a = NonNegative {
- getNonNegative :: a
- newtype NonZero a = NonZero {
- getNonZero :: a
- newtype NonEmpty a = NonEmpty {
- getNonEmpty :: [a]
- (\/) :: forall (m :: Type -> Type) a. Monad m => Series m a -> Series m a -> Series m a
- (><) :: forall (m :: Type -> Type) a b. Monad m => Series m a -> Series m b -> Series m (a, b)
- (<~>) :: forall (m :: Type -> Type) a b. Monad m => Series m (a -> b) -> Series m a -> Series m b
- (>>-) :: MonadLogic m => m a -> (a -> m b) -> m b
- localDepth :: forall (m :: Type -> Type) a. (Depth -> Depth) -> Series m a -> Series m a
- decDepth :: forall (m :: Type -> Type) a. Series m a -> Series m a
- getDepth :: forall (m :: Type -> Type). Series m Depth
- generate :: forall a (m :: Type -> Type). (Depth -> [a]) -> Series m a
- limit :: forall (m :: Type -> Type) a. Monad m => Int -> Series m a -> Series m a
- listSeries :: Serial Identity a => Depth -> [a]
- list :: Depth -> Series Identity a -> [a]
- listM :: Applicative m => Depth -> Series m a -> m [a]
- fixDepth :: forall (m :: Type -> Type) a. Series m a -> Series m (Series m a)
- decDepthChecked :: forall (m :: Type -> Type) a. Series m a -> Series m a -> Series m a
- constM :: Monad m => m b -> m (a -> b)
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.
cons2 :: forall (m :: Type -> Type) a b c. (Serial m a, Serial m b) => (a -> b -> c) -> Series m c Source #
Since: 1.0
cons3 :: forall (m :: Type -> Type) a b c d. (Serial m a, Serial m b, Serial m c) => (a -> b -> c -> d) -> Series m d Source #
Since: 1.0
cons4 :: forall (m :: Type -> Type) a b c d e. (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 :: forall (m :: Type -> Type) a b c d e f. (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 :: forall (m :: Type -> Type) a b c d e f g. (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 :: forall (m :: Type -> Type) a b. 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 t2instance CoSerial m a => CoSerial m (Light a) where
coseries rs =
newtypeAlts rs >>- \f ->
return $ \l ->
case l of
Light x -> f xFor 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.
alts1 :: forall (m :: Type -> Type) a b. CoSerial m a => Series m b -> Series m (a -> b) Source #
Since: 1.0
alts2 :: forall (m :: Type -> Type) a b c. (CoSerial m a, CoSerial m b) => Series m c -> Series m (a -> b -> c) Source #
Since: 1.0
alts3 :: forall (m :: Type -> Type) a b c d. (CoSerial m a, CoSerial m b, CoSerial m c) => Series m d -> Series m (a -> b -> c -> d) Source #
Since: 1.0
alts4 :: forall (m :: Type -> Type) a b c d e. (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 :: forall (m :: Type -> Type) a b c d e f. (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 :: forall (m :: Type -> Type) a b c d e f g. (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 :: forall (m :: Type -> Type) a b. CoSerial m a => Series m b -> Series m (a -> b) Source #
Same as alts1, but preserves the depth.
Since: 1.0
Basic definitions
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 :: Type -> Type) 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
| MonadTrans Series Source # | |
Defined in Test.SmallCheck.SeriesMonad | |
| Alternative (Series m) Source # | |
| Applicative (Series m) Source # | |
| Functor (Series m) Source # | |
| Monad (Series m) Source # | |
| MonadPlus (Series m) Source # | |
| Monad m => MonadLogic (Series m) Source # | |
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 :: Type -> Type) a where Source #
Since: 1.0
Minimal complete definition
Nothing
Methods
Instances
| Monad m => Serial m Void Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CBool Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CChar Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CClock Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CDouble Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CFloat Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CInt Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CIntMax Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CIntPtr Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CLLong Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CLong Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CPtrdiff Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CSChar Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CSUSeconds Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CShort Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CSigAtomic Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CSize Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CTime Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUChar Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUInt Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUIntMax Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUIntPtr Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CULLong Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CULong Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUSeconds Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CUShort Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m CWchar Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Int16 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Int32 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Int64 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Int8 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Word16 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Word32 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Word64 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Word8 Source # | Since: 1.1.4 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Ordering Source # | Since: 1.2.1 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Integer Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Natural Source # | Since: 1.1.3 |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m () Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Bool Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Char Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Double Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Float Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Int Source # | |
Defined in Test.SmallCheck.Series | |
| Monad m => Serial m Word Source # | Since: 1.1.3 |
Defined in Test.SmallCheck.Series | |
| Serial m a => Serial m (Complex a) Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Serial m a => Serial m (NonEmpty a) Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| (Integral i, Serial m i) => Serial m (Ratio i) Source # | Since: 1.1 |
Defined in Test.SmallCheck.Series | |
| Serial m a => Serial m (NonEmpty a) Source # | |
| (Num a, Ord a, Serial m a) => Serial m (NonNegative a) Source # | |
Defined in Test.SmallCheck.Series Methods series :: Series m (NonNegative a) Source # | |
| (Num a, Ord a, Serial m a) => Serial m (NonZero a) Source # | |
| (Num a, Ord a, Serial m a) => Serial m (Positive a) Source # | |
| Serial m a => Serial m (Maybe a) Source # | |
Defined in Test.SmallCheck.Series | |
| Serial m a => Serial m [a] Source # | |
Defined in Test.SmallCheck.Series | |
| (Serial m a, Serial m b) => Serial m (Either a b) Source # | |
Defined in Test.SmallCheck.Series | |
| (Serial m a, Serial m b) => Serial m (a, b) Source # | |
Defined in Test.SmallCheck.Series | |
| (CoSerial m a, Serial m b) => Serial m (a -> b) Source # | |
Defined in Test.SmallCheck.Series | |
| (Serial m a, Serial m b, Serial m c) => Serial m (a, b, c) Source # | |
Defined in Test.SmallCheck.Series | |
| (Serial m a, Serial m b, Serial m c, Serial m d) => Serial m (a, b, c, d) Source # | |
Defined in Test.SmallCheck.Series | |
| (Monad m, Serial m (f (g a))) => Serial m (Compose f g a) Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| (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 |
Defined in Test.SmallCheck.Series | |
| (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 |
Defined in Test.SmallCheck.Series | |
class Monad m => CoSerial (m :: Type -> Type) 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.
Instances
| Monad m => CoSerial m Void Source # | Since: 1.2.0 |
| Monad m => CoSerial m CBool Source # | Since: 1.2.0 |
| Monad m => CoSerial m CChar Source # | Since: 1.2.0 |
| Monad m => CoSerial m CClock Source # | Since: 1.2.0 |
| Monad m => CoSerial m CDouble Source # | Since: 1.2.0 |
| Monad m => CoSerial m CFloat Source # | Since: 1.2.0 |
| Monad m => CoSerial m CInt Source # | Since: 1.2.0 |
| Monad m => CoSerial m CIntMax Source # | Since: 1.2.0 |
| Monad m => CoSerial m CIntPtr Source # | Since: 1.2.0 |
| Monad m => CoSerial m CLLong Source # | Since: 1.2.0 |
| Monad m => CoSerial m CLong Source # | Since: 1.2.0 |
| Monad m => CoSerial m CPtrdiff Source # | Since: 1.2.0 |
| Monad m => CoSerial m CSChar Source # | Since: 1.2.0 |
| Monad m => CoSerial m CSUSeconds Source # | Since: 1.2.0 |
| Monad m => CoSerial m CShort Source # | Since: 1.2.0 |
| Monad m => CoSerial m CSigAtomic Source # | Since: 1.2.0 |
| Monad m => CoSerial m CSize Source # | Since: 1.2.0 |
| Monad m => CoSerial m CTime Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUChar Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUInt Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUIntMax Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUIntPtr Source # | Since: 1.2.0 |
| Monad m => CoSerial m CULLong Source # | Since: 1.2.0 |
| Monad m => CoSerial m CULong Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUSeconds Source # | Since: 1.2.0 |
| Monad m => CoSerial m CUShort Source # | Since: 1.2.0 |
| Monad m => CoSerial m CWchar Source # | Since: 1.2.0 |
| Monad m => CoSerial m Int16 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Int32 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Int64 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Int8 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Word16 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Word32 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Word64 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Word8 Source # | Since: 1.1.4 |
| Monad m => CoSerial m Ordering Source # | Since: 1.2.1 |
| Monad m => CoSerial m Integer Source # | |
| Monad m => CoSerial m Natural Source # | Since: 1.1.3 |
| Monad m => CoSerial m () Source # | |
| Monad m => CoSerial m Bool Source # | |
| Monad m => CoSerial m Char Source # | |
| Monad m => CoSerial m Double Source # | |
| Monad m => CoSerial m Float Source # | |
| Monad m => CoSerial m Int Source # | |
| Monad m => CoSerial m Word Source # | Since: 1.1.3 |
| CoSerial m a => CoSerial m (Complex a) Source # | Since: 1.2.0 |
| CoSerial m a => CoSerial m (NonEmpty a) Source # | Since: 1.2.0 |
| (Integral i, CoSerial m i) => CoSerial m (Ratio i) Source # | Since: 1.1 |
| CoSerial m a => CoSerial m (Maybe a) Source # | |
| CoSerial m a => CoSerial m [a] Source # | |
| (CoSerial m a, CoSerial m b) => CoSerial m (Either a b) Source # | |
| (CoSerial m a, CoSerial m b) => CoSerial m (a, b) Source # | |
| (Serial m a, CoSerial m a, Serial m b, CoSerial m b) => CoSerial m (a -> b) Source # | |
| (CoSerial m a, CoSerial m b, CoSerial m c) => CoSerial m (a, b, c) Source # | |
| (CoSerial m a, CoSerial m b, CoSerial m c, CoSerial m d) => CoSerial m (a, b, c, d) Source # | |
| (Monad m, CoSerial m (f (g a))) => CoSerial m (Compose f g a) Source # | Since: 1.2.0 |
| (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 |
| (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 |
Generic implementations
genericSeries :: forall (m :: Type -> Type) a. (Monad m, Generic a, GSerial m (Rep a)) => Series m a Source #
Since: 1.1.5
genericCoseries :: forall (m :: Type -> Type) a b. (Monad m, Generic a, GCoSerial m (Rep a)) => Series m b -> Series m (a -> b) Source #
Since: 1.1.5
Convenient wrappers
Positive x guarantees that \( x > 0 \).
Since: 1.0
Constructors
| Positive | |
Fields
| |
Instances
| Functor Positive Source # | Since: 1.2.0 |
| Foldable Positive Source # | Since: 1.2.0 |
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 elem :: Eq a => a -> Positive a -> Bool maximum :: Ord a => Positive a -> a minimum :: Ord a => Positive a -> a | |
| Traversable Positive Source # | Since: 1.2.0 |
| (Num a, Ord a, Serial m a) => Serial m (Positive a) Source # | |
| (Num a, Bounded a) => Bounded (Positive a) Source # | Since: 1.2.0 |
Defined in Test.SmallCheck.Series | |
| Enum a => Enum (Positive a) Source # | |
Defined in Test.SmallCheck.Series | |
| Num a => Num (Positive a) Source # | |
Defined in Test.SmallCheck.Series | |
| Integral a => Integral (Positive a) Source # | |
Defined in Test.SmallCheck.Series Methods quot :: Positive a -> Positive a -> Positive a rem :: Positive a -> Positive a -> Positive a div :: Positive a -> Positive a -> Positive a mod :: Positive a -> Positive a -> Positive a quotRem :: Positive a -> Positive a -> (Positive a, Positive a) divMod :: Positive a -> Positive a -> (Positive a, Positive a) | |
| Real a => Real (Positive a) Source # | |
Defined in Test.SmallCheck.Series Methods toRational :: Positive a -> Rational | |
| Show a => Show (Positive a) Source # | |
| Eq a => Eq (Positive a) Source # | |
| Ord a => Ord (Positive a) Source # | |
newtype NonNegative a Source #
NonNegative x guarantees that \( x \ge 0 \).
Since: 1.0
Constructors
| NonNegative | |
Fields
| |
Instances
NonZero x guarantees that \( x \ne 0 \).
Since: 1.2.0
Constructors
| NonZero | |
Fields
| |
Instances
| Functor NonZero Source # | |
| Foldable NonZero Source # | |
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 elem :: Eq a => a -> NonZero a -> Bool maximum :: Ord a => NonZero a -> a minimum :: Ord a => NonZero a -> a | |
| Traversable NonZero Source # | |
| (Num a, Ord a, Serial m a) => Serial m (NonZero a) Source # | |
| (Eq a, Num a, Bounded a) => Bounded (NonZero a) Source # | |
Defined in Test.SmallCheck.Series | |
| Enum a => Enum (NonZero a) Source # | |
Defined in Test.SmallCheck.Series | |
| Num a => Num (NonZero a) Source # | |
| Integral a => Integral (NonZero a) Source # | |
Defined in Test.SmallCheck.Series | |
| Real a => Real (NonZero a) Source # | |
Defined in Test.SmallCheck.Series Methods toRational :: NonZero a -> Rational | |
| Show a => Show (NonZero a) Source # | |
| Eq a => Eq (NonZero a) Source # | |
| Ord a => Ord (NonZero a) Source # | |
Defined in Test.SmallCheck.Series | |
NonEmpty xs guarantees that xs is not null.
Since: 1.1
Constructors
| NonEmpty | |
Fields
| |
Other useful definitions
(\/) :: forall (m :: Type -> Type) a. Monad m => Series m a -> Series m a -> Series m a infixr 7 Source #
Sum (union) of series.
Since: 1.0
(><) :: forall (m :: Type -> Type) a b. Monad m => Series m a -> Series m b -> Series m (a, b) infixr 8 Source #
Product of series
Since: 1.0
(<~>) :: forall (m :: Type -> Type) a b. Monad m => Series m (a -> b) -> Series m a -> Series m b infixl 4 Source #
localDepth :: forall (m :: Type -> Type) a. (Depth -> Depth) -> Series m a -> Series m a Source #
Run a series with a modified depth.
Since: 1.0
decDepth :: forall (m :: Type -> Type) a. 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
generate :: forall a (m :: Type -> Type). (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 :: Type -> Type) 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:
list3series:: [Int] -- returns [0,1,-1,2,-2,3,-3]list3 (series::SeriesIdentityInt) -- returns [0,1,-1,2,-2,3,-3]list2series:: [[Bool]] -- returns [[],[True],[False]]
The first two are equivalent. The second has a more explicit type binding.
Since: 1.0
fixDepth :: forall (m :: Type -> Type) a. 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 :: forall (m :: Type -> Type) a. 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