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.
val int : int tval string : string tfilter f shrink shrinks values the same as shrink, but
only keep smaller values that satisfy f.
This way it's easy to preserve invariants that are enforced by
generators, when shrinking values
val int_aggressive : int tShrink integers by trying all smaller integers (can take a lot of time!)
Try to shrink lists by removing elements one by one.
int list
one can try to decrease the integers).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.