ファイル/ディレクトリのコレクションを持っているので、すべての葉ファイルのコレクションを作成したいと思います。結果のコレクションが clojure.core.protocols/CollReduce プロトコルを拡張することを望みます。
プロトコルを拡張する必要がありますか、それともヘルパー関数はありますか?
言い換えると。レデューサーは並列リダクションでのみ役立ちますか、それともリデューサ可能なコレクションを並列で効果的に生成するために使用できますか?
問題を説明するために、ファイル階層が 2 レベルよりも深くないことを前提として、機能する可能性のある実装を示します (たとえば、コレクションにはファイルとディレクトリを含めることができますが、ディレクトリにはファイルのみを含めることができます)。
(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
さて、expand を再帰のようなスタイルで (というよりむしろ、変換のカスケードとして) 定義するとよいでしょう。そのため、すべてのレベルで機能しますが、並行して実行されます。レデューサーと同様に、リダクションで早期終了を定義できるため、特定の基準が満たされたときに停止する生成 (コレクションの展開) を定義できるようにしたいと考えています (ファイルの例のように、ディレクトリ階層ツリー内のファイルに到達する)。