From 96f6bbc9f49ba046b654f13005716e001537e682 Mon Sep 17 00:00:00 2001 From: Alex Engelberg Date: Tue, 19 Apr 2016 00:47:56 -0700 Subject: [PATCH 1/5] Add select-view path selector + test case --- src/clj/com/rpl/specter.cljx | 17 ++++++++++++++++ test/com/rpl/specter/core_test.cljx | 31 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/clj/com/rpl/specter.cljx b/src/clj/com/rpl/specter.cljx index c0802bf..fb564c4 100644 --- a/src/clj/com/rpl/specter.cljx +++ b/src/clj/com/rpl/specter.cljx @@ -256,6 +256,23 @@ ancestry)) ))) +(defn select-view + "Navigates to a sequence that contains the results of (select ...), + but is a view to the original structure that can be transformed." + [& path] + (fixed-pathed-path [late path] + (select* [this structure next-fn] + (next-fn (compiled-select late structure))) + (transform* [this structure next-fn] + (let [select-result (compiled-select late structure) + transformed (next-fn select-result) + values-to-insert (atom transformed)] + (compiled-transform late + (fn [_] (let [next-val (first @values-to-insert)] + (swap! values-to-insert rest) + next-val)) + structure))))) + (defpath keypath [key] (select* [this structure next-fn] (next-fn (get structure key))) diff --git a/test/com/rpl/specter/core_test.cljx b/test/com/rpl/specter/core_test.cljx index d23bd34..15f20e2 100644 --- a/test/com/rpl/specter/core_test.cljx +++ b/test/com/rpl/specter/core_test.cljx @@ -510,6 +510,37 @@ )) )) +(defspec select-view-nested-vectors + (for-all+ + [v1 (gen/vector + (gen/vector gen/int))] + (let [path (s/comp-paths (s/select-view s/ALL s/ALL)) + v2 (s/compiled-transform path reverse v1)] + (and + (= (s/compiled-select path v1) [(flatten v1)]) + (= (flatten v1) (reverse (flatten v2))) + (= (map count v1) (map count v2)))))) + +(defspec select-view-param-test + (for-all+ + [k gen/keyword + v (gen/vector + (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k)))] + (and + (= (s/compiled-select ((s/select-view s/ALL s/keypath) k) v) + [(map k v)]) + (let [v2 (s/compiled-transform ((s/comp-paths (s/select-view s/ALL s/keypath)) k) + reverse + v)] + (and (= (map k v) (reverse (map k v2))) + (= (map #(dissoc % k) v) + (map #(dissoc % k) v2))) ; only key k was touched in any of the maps + )))) + (defspec param-multi-path-test (for-all+ [k1 gen/keyword From fbacd49817541e2261f8bc72577922948374859c Mon Sep 17 00:00:00 2001 From: Alex Engelberg Date: Tue, 19 Apr 2016 00:48:49 -0700 Subject: [PATCH 2/5] Fix (is (= x) y) caught by humane-test-output --- test/com/rpl/specter/core_test.cljx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/com/rpl/specter/core_test.cljx b/test/com/rpl/specter/core_test.cljx index 15f20e2..29d974f 100644 --- a/test/com/rpl/specter/core_test.cljx +++ b/test/com/rpl/specter/core_test.cljx @@ -671,8 +671,8 @@ (is (= {:a {:aaa 4 :b {:c {:aaa 3} :aaa 2}}} (s/transform (map-key-walker :aaa) inc {:a {:aaa 3 :b {:c {:aaa 2} :aaa 1}}}))) - (is (= {:a {:c {:b "X"}}}) - (s/setval (map-key-walker :b) "X" {:a {:c {:b {:d 1}}}})) + (is (= {:a {:c {:b "X"}}} + (s/setval (map-key-walker :b) "X" {:a {:c {:b {:d 1}}}}))) ) (deftest recursive-params-composable-path-test From 4c8aeebafc42017c316818d79fb8a9a832df9cd6 Mon Sep 17 00:00:00 2001 From: Alex Engelberg Date: Tue, 19 Apr 2016 11:55:32 -0700 Subject: [PATCH 3/5] Switch from atom to mutable-cell --- src/clj/com/rpl/specter.cljx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/clj/com/rpl/specter.cljx b/src/clj/com/rpl/specter.cljx index fb564c4..4667ed0 100644 --- a/src/clj/com/rpl/specter.cljx +++ b/src/clj/com/rpl/specter.cljx @@ -266,10 +266,10 @@ (transform* [this structure next-fn] (let [select-result (compiled-select late structure) transformed (next-fn select-result) - values-to-insert (atom transformed)] + values-to-insert (i/mutable-cell transformed)] (compiled-transform late - (fn [_] (let [next-val (first @values-to-insert)] - (swap! values-to-insert rest) + (fn [_] (let [next-val (first (i/get-cell values-to-insert))] + (i/update-cell! values-to-insert rest) next-val)) structure))))) From d797e1aec18a835e8dc00e011488513b1bd2f272 Mon Sep 17 00:00:00 2001 From: Alex Engelberg Date: Tue, 19 Apr 2016 12:03:21 -0700 Subject: [PATCH 4/5] Add warning to docstring about input navigator requirement --- src/clj/com/rpl/specter.cljx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/clj/com/rpl/specter.cljx b/src/clj/com/rpl/specter.cljx index 4667ed0..42b32c2 100644 --- a/src/clj/com/rpl/specter.cljx +++ b/src/clj/com/rpl/specter.cljx @@ -258,7 +258,11 @@ (defn select-view "Navigates to a sequence that contains the results of (select ...), - but is a view to the original structure that can be transformed." + but is a view to the original structure that can be transformed. + + Requires that the input navigators will walk the structure's + children in the same order when executed on \"select\" and then + \"transform\"." [& path] (fixed-pathed-path [late path] (select* [this structure next-fn] From c7252a2b90b5b123f487b30a251d5f689e222ead Mon Sep 17 00:00:00 2001 From: Alex Engelberg Date: Tue, 19 Apr 2016 12:04:18 -0700 Subject: [PATCH 5/5] Changed name from 'select-view' to 'subselect' --- src/clj/com/rpl/specter.cljx | 2 +- test/com/rpl/specter/core_test.cljx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/clj/com/rpl/specter.cljx b/src/clj/com/rpl/specter.cljx index 42b32c2..7eae7ab 100644 --- a/src/clj/com/rpl/specter.cljx +++ b/src/clj/com/rpl/specter.cljx @@ -256,7 +256,7 @@ ancestry)) ))) -(defn select-view +(defn subselect "Navigates to a sequence that contains the results of (select ...), but is a view to the original structure that can be transformed. diff --git a/test/com/rpl/specter/core_test.cljx b/test/com/rpl/specter/core_test.cljx index 29d974f..9a54ebd 100644 --- a/test/com/rpl/specter/core_test.cljx +++ b/test/com/rpl/specter/core_test.cljx @@ -510,18 +510,18 @@ )) )) -(defspec select-view-nested-vectors +(defspec subselect-nested-vectors (for-all+ [v1 (gen/vector (gen/vector gen/int))] - (let [path (s/comp-paths (s/select-view s/ALL s/ALL)) + (let [path (s/comp-paths (s/subselect s/ALL s/ALL)) v2 (s/compiled-transform path reverse v1)] (and (= (s/compiled-select path v1) [(flatten v1)]) (= (flatten v1) (reverse (flatten v2))) (= (map count v1) (map count v2)))))) -(defspec select-view-param-test +(defspec subselect-param-test (for-all+ [k gen/keyword v (gen/vector @@ -531,9 +531,9 @@ gen/int k)))] (and - (= (s/compiled-select ((s/select-view s/ALL s/keypath) k) v) + (= (s/compiled-select ((s/subselect s/ALL s/keypath) k) v) [(map k v)]) - (let [v2 (s/compiled-transform ((s/comp-paths (s/select-view s/ALL s/keypath)) k) + (let [v2 (s/compiled-transform ((s/comp-paths (s/subselect s/ALL s/keypath)) k) reverse v)] (and (= (map k v) (reverse (map k v2)))