1 #pragma once
2 
3 #include "rapidcheck/Seq.h"
4 
5 namespace rc {
6 namespace shrink {
7 
8 /// Tries to shrink the given container by removing successively smaller
9 /// consecutive chunks of it.
10 ///
11 /// `Container` must support the following:
12 /// - `RandomAccessIterator begin(Container)`
13 /// - `RandomAccessIterator end(Container)`
14 /// - `Container::insert(It, It, It)`
15 /// - `Container::reserve(std::size_t)`
16 template <typename Container>
17 Seq<Container> removeChunks(Container elements);
18 
19 /// Tries to shrink each element of the given container using the given
20 /// callable to create sequences of shrinks for that element.
21 ///
22 /// `Container` must support `begin(Container)` and `end(Container)` which must
23 /// return random access iterators.
24 ///
25 /// @param elements  The collection whose elements to shrink.
26 /// @param shrink    A callable which returns a `Seq<T>` given an element
27 ///                  to shrink.
28 template <typename Container, typename Shrink>
29 Seq<Container> eachElement(Container elements, Shrink shrink);
30 
31 /// Shrinks an integral value towards another integral value.
32 ///
33 /// @param value   The value to shrink.
34 /// @param target  The integer to shrink towards.
35 template <typename T>
36 Seq<T> towards(T value, T target);
37 
38 /// Shrinks an arbitrary integral value.
39 template <typename T>
40 Seq<T> integral(T value);
41 
42 /// Shrinks an arbitrary real value.
43 template <typename T>
44 Seq<T> real(T value);
45 
46 /// Shrinks an arbitrary boolean value.
47 inline Seq<bool> boolean(bool value);
48 
49 /// Shrinks a text character.
50 template <typename T>
51 Seq<T> character(T value);
52 
53 } // namespace shrink
54 } // namespace rc
55 
56 #include "Shrink.hpp"
57