From 8053245c48ad6cc1b3450b7cf2cf88549a07d520 Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Mon, 29 Jun 2015 18:30:30 -0400 Subject: [PATCH] allow sets to be used directly as selector (acts as filter) --- src/clj/com/rpl/specter.clj | 14 +++++++++----- src/clj/com/rpl/specter/impl.clj | 9 +++++++++ test/clj/com/rpl/specter/core_test.clj | 9 +++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/clj/com/rpl/specter.clj b/src/clj/com/rpl/specter.clj index ea1ed40..8bcb504 100644 --- a/src/clj/com/rpl/specter.clj +++ b/src/clj/com/rpl/specter.clj @@ -161,12 +161,16 @@ (extend-type clojure.lang.AFn StructurePath (select* [afn structure next-fn] - (if (afn structure) - (next-fn structure))) + (filter-select afn structure next-fn)) (transform* [afn structure next-fn] - (if (afn structure) - (next-fn structure) - structure))) + (filter-transform afn structure next-fn))) + +(extend-protocol StructurePath + clojure.lang.PersistentHashSet + (select* [aset structure next-fn] + (filter-select aset structure next-fn)) + (transform* [aset structure next-fn] + (filter-transform aset structure next-fn))) (defn collect [& selector] (->SelectCollector select (comp-paths* selector))) diff --git a/src/clj/com/rpl/specter/impl.clj b/src/clj/com/rpl/specter/impl.clj index 4ccd7bd..48e8994 100644 --- a/src/clj/com/rpl/specter/impl.clj +++ b/src/clj/com/rpl/specter/impl.clj @@ -532,3 +532,12 @@ (.paths this)) )) +(defn filter-select [afn structure next-fn] + (if (afn structure) + (next-fn structure))) + +(defn filter-transform [afn structure next-fn] + (if (afn structure) + (next-fn structure) + structure)) + diff --git a/test/clj/com/rpl/specter/core_test.clj b/test/clj/com/rpl/specter/core_test.clj index 96fea73..98d024d 100644 --- a/test/clj/com/rpl/specter/core_test.clj +++ b/test/clj/com/rpl/specter/core_test.clj @@ -369,3 +369,12 @@ (is (= [] (transform FIRST inc []))) (is (= [] (transform LAST inc []))) ) + +(defspec set-filter-test + (for-all+ + [k1 gen/keyword + k2 (gen/such-that #(not= k1 %) gen/keyword) + k3 (gen/such-that (complement #{k1 k2}) gen/keyword) + v (gen/vector (gen/elements [k1 k2 k3]))] + (= (filter #{k1 k2} v) (select [ALL #{k1 k2}] v)) + ))