Shrinkers produce small values from large values. When a random test case fails, a shrinker finds the simplest version of the problem.
Basic Shrinkers
This shrinker treats a type as atomic, never attempting to produce smaller values.
val string : Base.string t
val int63 : Base.Int63.t t
val nativeint : Base.nativeint t
val option : 'a t -> 'a Base.option t
val list : 'a t -> 'a Base.list t
val array : 'a t -> 'a Base.array t
val ref : 'a t -> 'a Base.ref t
val lazy_t : 'a t -> 'a Base.Lazy.t t
val both : 'a t -> 'b t -> ('a * 'b) t
val either : 'a t -> 'b t -> ('a, 'b) Base.Either.t t
val result : 'a t -> 'b t -> ('a, 'b) Base.Result.t t
This helper module type exists separately just to open Bigarray
in its scope.
val bigstring :
(Base.char, Stdlib.Bigarray.int8_unsigned_elt, Stdlib.Bigarray.c_layout)
Stdlib.Bigarray.Array1.t
t
val float32_vec :
(Base.float, Stdlib.Bigarray.float32_elt, Stdlib.Bigarray.fortran_layout)
Stdlib.Bigarray.Array1.t
t
val float64_vec :
(Base.float, Stdlib.Bigarray.float64_elt, Stdlib.Bigarray.fortran_layout)
Stdlib.Bigarray.Array1.t
t
val float32_mat :
(Base.float, Stdlib.Bigarray.float32_elt, Stdlib.Bigarray.fortran_layout)
Stdlib.Bigarray.Array2.t
t
val float64_mat :
(Base.float, Stdlib.Bigarray.float64_elt, Stdlib.Bigarray.fortran_layout)
Stdlib.Bigarray.Array2.t
t
val map_t : 'key t -> 'data t -> ('key, 'data, 'cmp) Base.Map.t t
val set_t : 'elt t -> ('elt, 'cmp) Base.Set.t t
val map_tree_using_comparator :
comparator:('key, 'cmp) Base.Comparator.t ->
'key t ->
'data t ->
('key, 'data, 'cmp) Base.Map.Using_comparator.Tree.t t
val set_tree_using_comparator :
comparator:('elt, 'cmp) Base.Comparator.t ->
'elt t ->
('elt, 'cmp) Base.Set.Using_comparator.Tree.t t
Modifying Shrinkers
val map : 'a t -> f:('a -> 'b) -> f_inverse:('b -> 'a) -> 'b t
val filter : 'a t -> f:('a -> Base.bool) -> 'a t
val filter_map :
'a t ->
f:('a -> 'b Base.option) ->
f_inverse:('b -> 'a) ->
'b t
Filters and maps according to f
, and provides input to t
via f_inverse
. Only the f
direction produces options, intentionally.
Shrinkers for Recursive Types
val fixed_point : ('a t -> 'a t) -> 'a t
Ties the recursive knot to shrink recursive types.
For example, here is an shrinker for binary trees:
let tree_shrinker leaf_shrinker =
fixed_point (fun self ->
either leaf_shrinker (both self self)
|> map
~f:(function
| First leaf -> `Leaf leaf
| Second (l, r) -> `Node (l, r))
~f_inverse:(function
| `Leaf leaf -> First leaf
| `Node (l, r) -> Second (l, r)))
val of_lazy : 'a t Base.Lazy.t -> 'a t
Creates a t
that forces the lazy argument as necessary. Can be used to tie (mutually) recursive knots.
Low-level functions
Most users will not need to call these.
val create : ('a -> 'a Base.Sequence.t) -> 'a t
val shrink : 'a t -> 'a -> 'a Base.Sequence.t