From 21f117503e2944475e79e35554bc11e4ebf316e2 Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Sat, 13 Aug 2016 15:59:38 -0400 Subject: [PATCH] allow non-dynamic vars to be treated as constants and add test for constant detection --- src/clj/com/rpl/specter/impl.cljc | 20 ++++++++++++++++---- test/com/rpl/specter/core_test.cljc | 11 +++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/clj/com/rpl/specter/impl.cljc b/src/clj/com/rpl/specter/impl.cljc index b12a30b..3c99f55 100644 --- a/src/clj/com/rpl/specter/impl.cljc +++ b/src/clj/com/rpl/specter/impl.cljc @@ -709,7 +709,9 @@ ([v] (set-cell! MUST-CACHE-PATHS v))) (defn constant-node? [node] - (cond (record? node) false + (cond (and (instance? VarUse node) + (-> node :var meta :dynamic not)) true + (record? node) false (number? node) true (keyword? node) true (string? node) true @@ -719,6 +721,16 @@ (every? constant-node? (keys node))) :else false)) +(defn extract-constant [node] + (cond (some #(% node) [number? keyword? string?]) node + (instance? VarUse node) (:val node) + (vector? node) (vec (map extract-constant node)) + (set? node) (set (map extract-constant node)) + (map? node) (->> node + (map (fn [[k v]] [(extract-constant k) (extract-constant v)])) + (into {})) + :else (throw-illegal "Unknown node " node))) + (defn- extract-original-code [p] (cond @@ -925,7 +937,7 @@ (cond (or (root-params-nav? vv) (instance? ParamsNeededPath vv)) (if (every? constant-node? ps) - (apply vv ps) + (apply vv (map extract-constant ps)) (do (swap! params-atom #(vec (concat % ps))) (coerce-path vv))) @@ -969,7 +981,7 @@ (and (fn? vv) (-> vv meta :layerednav)) (if (every? constant-node? ps) - (apply vv ps) + (apply vv (map extract-constant ps)) (do (swap! params-atom conj (:code p)) (if (= (-> vv meta :layerednav) :lean) @@ -992,7 +1004,7 @@ :else (cond (set? p) (if (constant-node? p) - p + (extract-constant p) (do (swap! params-atom conj p) pred*)) diff --git a/test/com/rpl/specter/core_test.cljc b/test/com/rpl/specter/core_test.cljc index 92104f9..4b0b762 100644 --- a/test/com/rpl/specter/core_test.cljc +++ b/test/com/rpl/specter/core_test.cljc @@ -9,7 +9,7 @@ nav declarepath providepath select select-one select-one! select-first transform setval replace-in defnavconstructor select-any selected-any? collected? traverse - multi-transform]])) + multi-transform path]])) (:use #?(:clj [clojure.test :only [deftest is]]) #?(:clj [clojure.test.check.clojure-test :only [defspec]]) @@ -19,7 +19,7 @@ nav declarepath providepath select select-one select-one! select-first transform setval replace-in defnavconstructor select-any selected-any? collected? traverse - multi-transform]])) + multi-transform path]])) @@ -1341,3 +1341,10 @@ 1)))) + +(deftest inline-lean-path + ;; use executors from ALL because it's a lean navigator + (let [e (.-executors s/ALL)] + (is (identical? e (.-executors (path :a (s/view inc))))) + (is (identical? e (.-executors (path (s/keypath :a) (s/srange 2 7))))) + (is (identical? e (.-executors (path :a (s/selected? (s/view inc) (s/selected? (s/srange 2 7)))))))))