-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.clj
36 lines (31 loc) · 1.08 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(ns file-tree.core)
(def directory? (memfn ^java.io.File isDirectory))
(def list-files (memfn ^java.io.File listFiles))
(defn separate-dirs-from-files
"Takes a vector of [(dirs) (files)] and a java.io.File
Returns a vector of [(dirs) (files)] with the file added to dirs or files."
[[dirs files] ^java.io.File file]
(let [name (.getName file)]
(if (directory? file)
[(conj dirs name) files]
[dirs (conj files name)])))
(defn build-file-tree
"Takes a java file.
Returns a vector of [path-str (dirnames) (filenames)]"
[^java.io.File file]
(vec (cons (str file)
(reduce separate-dirs-from-files [() ()] (list-files file)))))
(defn walk-seq
"Walks breadth-first down a file path returning a sequence of folder trees.
Takes a string directory path or java file.
Returns lazy seq of [path-str (dirnames) (filenames)]."
[root-dir]
(->> root-dir
(clojure.java.io/file)
(file-seq)
(filter directory?)
(map build-file-tree)))
;; Usage in a REPL
(comment
(require '[file-tree.core :refer [walk-seq]])
(take 3 (walk-seq ".")))