Como filtrar o vetor de mapas por várias chaves no Clojure

Suponha que temos uma estrutura de dados como esta:

(def data
     (atom [{:id 1 :first-name "John1" :last-name "Dow1" :age "14"}
            {:id 2 :first-name "John2" :last-name "Dow2" :age "54"}
            {:id 3 :first-name "John3" :last-name "Dow3" :age "34"}
            {:id 4 :first-name "John4" :last-name "Dow4" :age "12"}
            {:id 5 :first-name "John5" :last-name "Dow5" :age "24"}]))

Aprendi como filtrá-lo por uma chave, por exemplo:

(defn my-filter
  [str-input]
  (filter #(re-find (->> (str str-input)
                         (lower-case)
                         (re-pattern))
                         (lower-case (:first-name %)))
            @data))

> (my-filter "John1")
> ({:last-name "Dow1", :age "14", :first-name "John1", :id 1})

Mas agora estou um pouco confuso sobre como filtrar dados:first-name, :last-name e:age maneira simples?

Atualizar: S, orry por não ser muito claro o suficiente para explicar qual é o problema ... Na verdade, eu quero todas as chaves:first-name, :last-name e:age paticipar na função de filtro, para que, sestr-input não corresponde:first-nameval, verifique se ele corresponde:last-nameé val e assim por diante.

Atualização 2: Depois de tentarsome-fn, every-pred etransducers, Não recebi o que preciso, por exemplo regex em predicados de filtro, acho que é falta de conhecimento por enquanto. Então, acabei com essa função que funciona bem, mas o código é feio e duplicado. Como posso me livrar da duplicação de código?

(defn my-filter [str-input]
  (let [firstname (filter #(re-find (->> (str str-input)
                                         (upper-case)
                                         (re-pattern))
                                    (upper-case (:first-name %)))
                     @data)
        lastname (filter #(re-find (->> (str str-input)
                                        (upper-case)
                                        (re-pattern))
                                   (upper-case (:last-name %)))
                    @data)
        age (filter #(re-find (->> (str str-input)
                                   (upper-case)
                                   (re-pattern))
                              (upper-case (:age %)))
               @data)]
    (if-not (empty? firstname)
      firstname
      (if-not (empty? lastname)
        lastname
        (if-not (empty? age)
          age)))))

questionAnswers(2)

yourAnswerToTheQuestion