I think the syntax of {{clojure.core/for}} would be a good fit for test.check's combinators. For example:
(defn gen-even-subset
"Returns a generator that generates an even-cardinality
subset of the given elements"
[elements]
(gen/for [bools (apply gen/tuple (repeat (count elements) gen/boolean))
:let [true-count (->> bools (filter identity) (count))]
:when (even? true-count)]
(->> (map list bools elements)
(filter first)
(map second)
(set))))
This combines the capabilities of {{fmap}}, {{bind}}, and {{such-that}} into a familiar syntax.
One downside here is the temptation to use multiple clauses for independent generators, resulting in a use of {{gen/bind}} when {{gen/tuple}} would be simpler and presumably shrink easier. An approach to this is an additional supported clause, perhaps called {{:parallel}}, that uses the syntax of {{:let}} to provide the functionality of {{gen/tuple}}:
(gen/for [:parallel [n1 gen/nat
n2 gen/nat]
:let [sum (+ n1 n2)]]
{:nums [n1 n2] :sum sum})
Compared to {{gen/tuple}}, this has the advantage of placing generators syntactically next to names, rather than segregating the generators from the names.
The {{:parallel}} feature has not been added to the current patches.