                 (recur children head (inc total-nodes-visited) (inc depth) true)))))))))
 
 (defn- failure
-  [property result trial-number size failing-params]
+  [property property-fun result trial-number size failing-params]
   (ct/report-failure property result trial-number failing-params)
   {:result result
    :failing-size size
    :num-tests trial-number
    :fail (vec failing-params)
-   :shrunk (shrink-loop property (vec failing-params))})
+   :shrunk (shrink-loop property-fun
+                        (vec failing-params))})
 

              result (:result result-map)
              args (:args result-map)]
          (cond
            (instance? Throwable result) (failure property result so-far size args)
            result (do
                     (ct/report-trial property so-far num-tests)
                     (recur (inc so-far) rest-size-seq))
            :default (failure property result so-far size args)))))))

(defmacro forall [bindings expr]
  `(let [~@bindings]

           depth 0
           can-set-new-best? true]
      ; TODO why does this cause failures? (or (empty? nodes) (>= total-nodes-visited 10000))
      (if (empty? nodes)
        (smallest-shrink total-nodes-visited depth f)
        (let [[head & tail] nodes]
          (if (safe-apply-props prop head)
