clojure - Filter a collection by multiple attributes provided with a map -


i have collection want filter. filter done using map key attribute in collection item, , value collection items should match. example:

(let [filters {:name "test"                :type "new"}       collection [{:name "testable"  :type "old"}                   {:name "shoudwork" :type "new"}                   {:name "testable"  :type "new"}]]) 

right now, have built filter function take single attribute , value. want expand able take filter hashmap.

this current filter looks like:

(filter #(re-find (re-pattern "test") (string/lower-case (% :name))) collection) 

in other words, want filter not take "test" hardcoded, should value filters let binding, , (% :name) not hardcoded :name, key filters let binding.

create function returns filtering function single [key expected-value]:

(defn regex-value [[k expected-rex]]   (fn [c] (re-find (re-pattern expected-rex)                     (clojure.string/lower-case (get c k))))) 

create function create compounded filtering condition:

(defn build-filter [filters]   (apply every-pred (map regex-value filters))) 

use it:

(let [filters {:name "test"                :type "new"}       collection [{:name "testable"  :type "old"}                   {:name "shoudwork" :type "new"}                   {:name "testable"  :type "new"}]]   (filter (build-filter filters) collection)) 

Comments

Popular posts from this blog

Capture and play voice with Asterisk ARI -

c++ - Can not find the "fiostream.h" file -

java - Why database contraints in HSQLDB are only checked during a commit when using transactions in Hibernate? -