allow non-dynamic vars to be treated as constants and add test for constant detection

This commit is contained in:
Nathan Marz 2016-08-13 15:59:38 -04:00
parent 1b5b19c7c8
commit 21f117503e
2 changed files with 25 additions and 6 deletions

View file

@ -709,7 +709,9 @@
([v] (set-cell! MUST-CACHE-PATHS v))) ([v] (set-cell! MUST-CACHE-PATHS v)))
(defn constant-node? [node] (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 (number? node) true
(keyword? node) true (keyword? node) true
(string? node) true (string? node) true
@ -719,6 +721,16 @@
(every? constant-node? (keys node))) (every? constant-node? (keys node)))
:else false)) :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] (defn- extract-original-code [p]
(cond (cond
@ -925,7 +937,7 @@
(cond (cond
(or (root-params-nav? vv) (instance? ParamsNeededPath vv)) (or (root-params-nav? vv) (instance? ParamsNeededPath vv))
(if (every? constant-node? ps) (if (every? constant-node? ps)
(apply vv ps) (apply vv (map extract-constant ps))
(do (do
(swap! params-atom #(vec (concat % ps))) (swap! params-atom #(vec (concat % ps)))
(coerce-path vv))) (coerce-path vv)))
@ -969,7 +981,7 @@
(and (fn? vv) (-> vv meta :layerednav)) (and (fn? vv) (-> vv meta :layerednav))
(if (every? constant-node? ps) (if (every? constant-node? ps)
(apply vv ps) (apply vv (map extract-constant ps))
(do (do
(swap! params-atom conj (:code p)) (swap! params-atom conj (:code p))
(if (= (-> vv meta :layerednav) :lean) (if (= (-> vv meta :layerednav) :lean)
@ -992,7 +1004,7 @@
:else :else
(cond (set? p) (cond (set? p)
(if (constant-node? p) (if (constant-node? p)
p (extract-constant p)
(do (swap! params-atom conj p) (do (swap! params-atom conj p)
pred*)) pred*))

View file

@ -9,7 +9,7 @@
nav declarepath providepath select select-one select-one! nav declarepath providepath select select-one select-one!
select-first transform setval replace-in defnavconstructor select-first transform setval replace-in defnavconstructor
select-any selected-any? collected? traverse select-any selected-any? collected? traverse
multi-transform]])) multi-transform path]]))
(:use (:use
#?(:clj [clojure.test :only [deftest is]]) #?(:clj [clojure.test :only [deftest is]])
#?(:clj [clojure.test.check.clojure-test :only [defspec]]) #?(:clj [clojure.test.check.clojure-test :only [defspec]])
@ -19,7 +19,7 @@
nav declarepath providepath select select-one select-one! nav declarepath providepath select select-one select-one!
select-first transform setval replace-in defnavconstructor select-first transform setval replace-in defnavconstructor
select-any selected-any? collected? traverse select-any selected-any? collected? traverse
multi-transform]])) multi-transform path]]))
@ -1341,3 +1341,10 @@
1)))) 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)))))))))