Skip to content

Instantly share code, notes, and snippets.

@deltam
Created January 31, 2011 13:26
Show Gist options
  • Select an option

  • Save deltam/804021 to your computer and use it in GitHub Desktop.

Select an option

Save deltam/804021 to your computer and use it in GitHub Desktop.
;; fill-queue による非同期フックの実験
;; 指定したファイルの最終更新日時が変わったらキューにそのファイル名をプッシュする
(ns watch-file-status
(:use [clojure.contrib.seq :only (fill-queue)])
(:import [java.io File]
[java.util Date]
[java.text SimpleDateFormat]))
(defn- last-modified [filename] (.lastModified (File. filename)))
(defn- thread-name [] (.getName (Thread/currentThread)))
(defn modified-status
"ファイル名をキー、その最終更新日時を値にしたマップを返す"
[filenames]
(reduce into (map #(hash-map % (last-modified %)) filenames)))
(defn watching-loop [fill filenames]
(let [updater (partial modified-status filenames) ; update function
last (atom (updater))]
(println "watching-loop thread:" (thread-name))
(loop [now (updater)]
(let [mods (filter #(> (now %) (@last %)) filenames)]
(if-not (empty? mods)
(do (doseq [f mods]
(fill f)) ; hook
(reset! last now))))
(Thread/sleep 1000) ; interval 1 sec
(recur (updater)))))
(defn show-file-status [filename]
(let [dateformat (SimpleDateFormat. "yyyy-MM-dd HH:mm:ss")]
(println "modified:" filename)
(println "datetime:" (.format dateformat (last-modified filename)))))
;; main
(let [args *command-line-args*]
(println "watching..." args)
(println "main thread:" (thread-name))
(doseq [changed-file (fill-queue (fn [fill] (watching-loop fill args)))]
(show-file-status changed-file)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment