From 3693d307fc62d178ab0378ac2ae65a49999aa9f4 Mon Sep 17 00:00:00 2001 From: nathanmarz Date: Sun, 12 Feb 2017 11:37:14 -0500 Subject: [PATCH] fix traverse-all to properly propagate reduced vals, add tests --- src/clj/com/rpl/specter/impl.cljc | 12 +++++++----- test/com/rpl/specter/core_test.cljc | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/clj/com/rpl/specter/impl.cljc b/src/clj/com/rpl/specter/impl.cljc index 93a45a6..d4afa96 100644 --- a/src/clj/com/rpl/specter/impl.cljc +++ b/src/clj/com/rpl/specter/impl.cljc @@ -293,9 +293,7 @@ (result-fn (conj vals structure))))))) - - -(defn do-compiled-traverse [apath structure] +(defn do-compiled-traverse* [apath structure] (reify #?(:clj clojure.lang.IReduce :cljs cljs.core/IReduce) (#?(:clj reduce :cljs -reduce) [this afn] @@ -312,9 +310,12 @@ newv ; to support reduced handling during traverse )) structure) - (unreduced (get-cell cell)) + (get-cell cell) )))) +(defn do-compiled-traverse [apath structure] + (unreduced (do-compiled-traverse* apath structure))) + (defn compiled-traverse-all* [path] (fn [xf] @@ -326,7 +327,8 @@ (fn [r i] (xf r i)) result - (do-compiled-traverse path input) + ;; use this one to make sure reduced vals are propagated back + (do-compiled-traverse* path input) ) )))) diff --git a/test/com/rpl/specter/core_test.cljc b/test/com/rpl/specter/core_test.cljc index f21895d..cef84ce 100644 --- a/test/com/rpl/specter/core_test.cljc +++ b/test/com/rpl/specter/core_test.cljc @@ -10,7 +10,7 @@ select-first transform setval replace-in select-any selected-any? collected? traverse multi-transform path dynamicnav recursive-path - defdynamicnav]])) + defdynamicnav traverse-all]])) (:use #?(:clj [clojure.test :only [deftest is]]) #?(:clj [clojure.test.check.clojure-test :only [defspec]]) @@ -21,7 +21,7 @@ select-first transform setval replace-in select-any selected-any? collected? traverse multi-transform path dynamicnav recursive-path - defdynamicnav]])) + defdynamicnav traverse-all]])) @@ -1358,3 +1358,20 @@ data ))) )) + +(deftest traverse-all-test + (is (= 3 + (transduce (comp (mapcat identity) + (traverse-all :a)) + (completing (fn [r i] (if (= i 4) (reduced r) (+ r i)))) + 0 + [[{:a 1}] [{:a 2}] [{:a 4}] [{:a 5}]]))) + (is (= 6 + (transduce (traverse-all [s/ALL :a]) + + + 0 + [[{:a 1} {:a 2}] [{:a 3}]] + ))) + (is (= [1 2] + (into [] (traverse-all :a) [{:a 1} {:a 2}]))) + )