allow sets to be used directly as selector (acts as filter)
This commit is contained in:
parent
bcc15b1587
commit
8053245c48
3 changed files with 27 additions and 5 deletions
|
|
@ -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)))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
))
|
||||
|
|
|
|||
Loading…
Reference in a new issue