From e2b6f63f99a9ca413225cdb8547ceda8e253f29c Mon Sep 17 00:00:00 2001 From: nathanmarz Date: Sun, 12 Feb 2017 15:24:13 -0500 Subject: [PATCH] fix traverse with early termination to unwrap reduced vals --- src/clj/com/rpl/specter/impl.cljc | 12 ++++++++++-- test/com/rpl/specter/core_test.cljc | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/clj/com/rpl/specter/impl.cljc b/src/clj/com/rpl/specter/impl.cljc index d4afa96..15dd22f 100644 --- a/src/clj/com/rpl/specter/impl.cljc +++ b/src/clj/com/rpl/specter/impl.cljc @@ -314,8 +314,16 @@ )))) (defn do-compiled-traverse [apath structure] - (unreduced (do-compiled-traverse* apath structure))) - + (let [traverser (do-compiled-traverse* apath structure)] + (reify #?(:clj clojure.lang.IReduce :cljs cljs.core/IReduce) + (#?(:clj reduce :cljs -reduce) + [this afn] + (#?(:clj .reduce :cljs -reduce) this afn (afn))) + (#?(:clj reduce :cljs -reduce) + [this afn start] + (let [res (#?(:clj .reduce :cljs -reduce) traverser afn start)] + (unreduced res) + ))))) (defn compiled-traverse-all* [path] (fn [xf] diff --git a/test/com/rpl/specter/core_test.cljc b/test/com/rpl/specter/core_test.cljc index cef84ce..facf982 100644 --- a/test/com/rpl/specter/core_test.cljc +++ b/test/com/rpl/specter/core_test.cljc @@ -1375,3 +1375,11 @@ (is (= [1 2] (into [] (traverse-all :a) [{:a 1} {:a 2}]))) ) + +(deftest early-terminate-traverse-test + (is (= 6 + (reduce + (completing (fn [r i] (if (> r 5) (reduced r) (+ r i)))) + 0 + (traverse [s/ALL s/ALL] + [[1 2] [3 4] [5]])))))