module Shrink:`sig`

..`end`

Shrinking is used to reduce the size of a counter-example. It tries
to make the counter-example smaller by decreasing it, or removing
elements, until the property to test holds again; then it returns the
smallest value that still made the test fail.

type`'a`

t =`'a -> 'a QCheck.Iter.t`

Given a counter-example, return an iterator on smaller versions
of the counter-example.

`val nil : ``'a t`

No shrink

`val unit : ``unit t`

`val char : ``char t`

`val int : ``int t`

`val option : ``'a t -> 'a option t`

`val string : ``string t`

`val list : ``?shrink:'a t -> 'a list t`

Try to shrink lists by removing elements one by one.

`shrink`

: if provided, will be used to also try to reduce
the elements of the list themselves (e.g. in an `int list`

one can try to decrease the integers).`val array : ``?shrink:'a t -> 'a array t`

Shrink an array.

`shrink`

: see `QCheck.Shrink.list`

`val pair : ``'a t -> 'b t -> ('a * 'b) t`

`pair a b`

uses `a`

to shrink the first element of tuples,
then tries to shrink the second element using `b`

.
It is often better, when generating tuples, to put the "simplest"
element first (atomic type rather than list, etc.) because it will be
shrunk earlier. In particular, putting functions last might help.`val triple : ``'a t ->`

'b t -> 'c t -> ('a * 'b * 'c) t

Similar to

`QCheck.Shrink.pair`

`val quad : ``'a t ->`

'b t ->

'c t ->

'd t -> ('a * 'b * 'c * 'd) t

Similar to

`QCheck.Shrink.pair`