マージする必要があるマップ (テレビ番組) のソートされていないシーケンスがあります。つまり、結果のシーケンスは特別なキー (:title) に基づいて一意であり、他のキーは重複とマージされます。これは、特定のテレビ番組のすべての番組を、それらに関するすべての情報を保持する 1 つのエントリにマージするものと考えてください。
プログラムは次のようになります (簡略化)。
[{:prog {:title "", ...} :starts #{} :directors #{} :actors #{} :categories {}}, ...]
マージを行う現在の関数は次のとおりです。
(defn- merge-programs [all-programs]
"Merge all instances of the same program"
(loop [acc []
programs all-programs]
(if (empty? programs)
acc
(let [first-prog (first programs)
dups (filter #(= (:title first-prog) (:title (:prog %))) programs)
merged-prog {:prog first-prog
:starts (apply set/union (map :starts dups))
:directors (apply set/union (map :directors dups))
:actors (apply set/union (map :actors dups))
:categories (apply set/union (map :categories dups))}]
(recur (conj acc merged-prog)
(remove #(= (:title first-prog) (:title (:prog %)))) programs))))))
このマージを並行して行う方法を見つけようとしています。しかし、ループの各反復の後、開始シーケンスの「ランダムな」要素が削除されるため、分割統治アプローチが必要になります。
これを行う方法についてのアイデアはありますか?