从文件层次结构中创建可折叠集合的惯用方法是什么?

时间:2014-09-09 15:55:54

标签: clojure reducers

拥有一组文件/目录我想创建所有叶子文件的集合。 我希望得到的集合扩展了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  

现在,将扩展定义为类似递归的样式(或者更确切地说是一系列转换)会很好,因此它适用于所有级别,但是以并行方式执行。与reducers一样,我们可以在reduce中定义提前终止,我希望能够定义生成(集合扩展),当满足某些条件时(在文件示例中到达目录层次结构树中的文件),该生成停止(

0 个答案:

没有答案