拥有一组文件/目录我想创建一个所有叶子文件的集合。我希望生成的集合扩展 clojure.core.protocols/CollReduce 协议。
我需要扩展协议还是有帮助功能?
换句话说。减速器仅有助于并行减少还是我可以使用它们来有效地并行生成可简化的集合?
为了说明这个问题,让我展示一下可行的实现,假设文件层次结构不超过两个级别(例如,我们的集合可以包含文件和目录,但目录只能包含文件)
(ns user
[import [java.io File]])
(defn expand [reduction-function]
(fn [result input]
(if (.isFile input)
(reduction-function result input)
; if not a file we assume it's a directory
(reduce reduction-function result (.listFiles input)))))
(defn process [xfn c]
(lazy-seq (when-let [s (seq c)]
(concat ((xfn #(concat %1 (list %2))) '() (first s))
(process xfn (rest s))))))
(def f (File. "C:\\WORK"))
(process expand [f]) ; => produces list of files
现在,以类似递归的方式(或者更确切地说作为转换的级联)定义扩展会很好,因此它适用于所有级别,但以并行方式执行。与 reducer 一样,我们可以定义减少的提前终止,我希望能够定义在满足某些条件时停止的生成(集合扩展)(在目录层次结构树中到达文件,如文件示例)