 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; fapply + pure
+;;; fapply + pure + filterapply
 
 (declare deepfapply)
 

     (f m)))
  ([f m & ms]
   ;; same thing here but we'll mutually walk ms
   (let [ms (cons m ms)]
     (cond
       (list? m) (map (partial flst f) ms)
       (vector? m) (map (partial fvec f) ms)
       (seq? m) (map (partial fseq f) ms)
       (set? m) (map (partial fset f) ms)
       (associative? m) (map (partial fassc f) ms)
       (fn? m) (map #(comp f %) ms)
       :else
       (map f ms)))))

(def <-$>
  "An alias for deepfmap"

                (if-let [[_ mv] (find m fk)]
                  (assoc acc fk (filterapply f mv))
                  acc))
     ;; start with an empty map to filter vals not in applicative
     {} fs))
  ([fs m ms]
   (let [mcoll (cons m ms)]
     (reduce-kv (fn [acc fk f]
                  ;; find all the matching keys in mcoll
                  (if-let [vals (group-vals mcoll fk)]
                    (assoc acc fk
                      ;; eval the nested maps and bind them to the output
                      (apply (partial filterapply f) vals))
                    acc))
       ;; use the empty map here too
       {} fs))))

(defn filterapply
