This seems like a standard optimization (sequence fusion) we could apply to rose/filter. Based on my reading, it might reduce the memory usage of shrinking common generators like such-that, vector and choose.
(defn filter
"Returns a new Rose tree whose values pass `pred`. Values who
do not pass `pred` have their children cut out as well."
{:no-doc true}
[pred rose]
(make-rose (root rose)
- (map #(filter pred %)
- (core/filter #(pred (root %)) (children rose)))))
+ (keep #(when (pred (root %))
+ (filter pred %))
+ (children rose))))
https://github.com/frenchy64/test.check/pull/5/changes