cryogen-core/src/cryogen_core/watcher.clj
Jan Stępień aa7ac4d98c require pandect.algo.md5 instead of pandect.core
This makes compilation of cryogen-core.watcher faster by reducing the
number of its dependencies. Now it depends just on pandect.algo.md5
instead of all pandect.algo.*
2015-09-21 15:23:13 +02:00

35 lines
1.1 KiB
Clojure

(ns cryogen-core.watcher
(:require [clojure.java.io :refer [file]]
[cryogen-core.io :refer [ignore]]
[pandect.algo.md5 :refer [md5]]
[clojure.set :as set]))
(defn get-assets [path ignored-files]
(->> path
file
file-seq
(filter #(not (.isDirectory ^java.io.File %)))
(filter (ignore ignored-files))))
(defn checksums [path ignored-files]
(let [files (get-assets path ignored-files)]
(zipmap (map md5 files) files)))
(defn find-changes [old-sums new-sums]
(let [old-sum-set (-> old-sums keys set)
new-sum-set (-> new-sums keys set)]
(when-some [changes (set/difference new-sum-set old-sum-set)]
(vals (select-keys new-sums changes)))))
(defn watch-assets [root ignored-files action]
(loop [sums (checksums root ignored-files)]
(Thread/sleep 300)
(let [new-sums (checksums root ignored-files)]
(when (find-changes sums new-sums)
(action))
(recur new-sums))))
(defn start-watcher! [root ignored-files action]
(doto (Thread. #(watch-assets root ignored-files action))
(.setDaemon true)
(.start)))