         after  (apply tree-for srcs)]
     (doseq [[op p x] (patch pred before after)]
       (case op
-        :rm (io/delete-file x true)
+        :rm (delete-file x)
         :cp (copy-with-lastmod x (io/file dest p))))))
 
 (defn watcher! [pred & dirs]

             (mapcat (comp rest file-seq))
             (group-by (memfn isFile)))
        to-rm (concat files (reverse dirs'))]
    (doseq [f to-rm] (io/delete-file f true))))

(defn delete-empty-subdirs!
  [dir]
  (let [empty-dir? #(and (.isDirectory %) (empty? (.list %)))
        subdirs    (->> dir io/file file-seq (filter (memfn isDirectory)))]
    (doseq [f (reverse subdirs)]
      (when (empty-dir? f) (io/delete-file f true)))))

(defn- contains-files?
  [dir]

(defmacro guard [& exprs]
  `(try (do ~@exprs) (catch Throwable _#)))

(defn delete-file
  [f]
  (try
    (io/delete-file f)
    (catch Exception err
      (println "ERROR deleting" f err))))

(defn clean! [& files]
  (doseq [f files]
    (doall (->> f io/file file-seq (keep file?) (map delete-file)))))

(defn empty-dir!
  [& dirs]
