From 340d6d3065648b74a7b604cc8f2c786f21beee0e Mon Sep 17 00:00:00 2001 From: nathanmarz Date: Thu, 1 Jun 2017 01:38:12 -0400 Subject: [PATCH] reimplement walker in terms of recursive-path to support NONE removal --- src/clj/com/rpl/specter.cljc | 23 ++++++++++++----------- src/clj/com/rpl/specter/navs.cljc | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/clj/com/rpl/specter.cljc b/src/clj/com/rpl/specter.cljc index d05c6a8..81f5c2d 100644 --- a/src/clj/com/rpl/specter.cljc +++ b/src/clj/com/rpl/specter.cljc @@ -10,7 +10,8 @@ defdynamicnav dynamicnav richnav - defrichnav]] + defrichnav + recursive-path]] [com.rpl.specter.util-macros :refer [doseqres]])) @@ -826,16 +827,6 @@ (merge (reduce dissoc structure m-keys) newmap)))) -(defnav - ^{:doc "Using clojure.walk, navigate the data structure until reaching - a value for which `afn` returns truthy."} - walker - [afn] - (select* [this structure next-fn] - (i/walk-select afn next-fn structure)) - (transform* [this structure next-fn] - (i/walk-until afn next-fn structure))) - (defnav ^{:doc "Like `walker` but maintains metadata of any forms traversed."} codewalker @@ -1285,3 +1276,13 @@ to implement post-order traversal." [& path] (multi-path path STAY)) + +(def + ^{:doc "Navigate the data structure until reaching + a value for which `afn` returns truthy. Has + same semantics as clojure.walk."} + walker + (recursive-path [apred] p + (cond-path (pred apred) STAY + coll? [ALL p] + ))) diff --git a/src/clj/com/rpl/specter/navs.cljc b/src/clj/com/rpl/specter/navs.cljc index c965849..87ac404 100644 --- a/src/clj/com/rpl/specter/navs.cljc +++ b/src/clj/com/rpl/specter/navs.cljc @@ -129,7 +129,7 @@ (all-transform [structure next-fn] (non-transient-map-all-transform structure next-fn (empty structure))) - clojure.lang.IRecord + #?(:clj clojure.lang.IRecord :cljs cljs.core/IRecord) (all-transform [structure next-fn] (reduce (fn [res kv] (conj res (next-fn kv)))