 
 (defn deeppure
   "This is a recursive version of pure. It will replace all values in
-   the given type with val. All keys on maps will be preserved."
+   the given type with value. All keys on maps will also be preserved."
   ([m]
    (fn [value]
      (pure m value)))

     (coll? m) (coll-pure m value)
     :else
     value)))

     (mapcat #(apply map (partial deepfapply %) m ms) fs))))

(defn- group-keys [ms k]
  (let [matches (map #(find % k) ms)]
    (when-not (every? nil? matches)
        (vals matches))))

(defn- assc-fapply
  ([fs m]
