| Introduction |
| ------------------------------------------------------------ |
| |
| pold (partition and fold) is a Clojure library for |
| efficiently dividing data into any number of partitions and |
| accumulating them into a result. |
| |
| |
| Installation |
| ------------------------------------------------------------ |
| |
| This library can be installed from Clojars[1]. |
| |
| Leiningen/Boot |
| -------------- |
| |
| [de.dixieflatline/pold "0.2.0-SNAPSHOT"] |
| |
| |
| Usage |
| ------------------------------------------------------------ |
| |
| Basic example |
| ------------- |
| |
| pold applies a stateful partition and accumulation closure |
| to each value of a collection. The closure can be built with |
| partitioner which takes a set of partition functions. |
| |
| Assume you want to partition numbers based on whether they |
| are even or odd and return the sum of each partition. In |
| this case, you could use odd? as key function. Whenever the |
| key changes, a new partition is created. The first number of |
| the partition is used as accumulator, which is initialized |
| with identity. Each subsequent number is added to the |
| accumulator, updating it. |
| |
| (require '[pold.core :refer [pold partitioner part]]) |
| |
| (pold (partitioner (part odd? identity +)) |
| [1 1 2 4 3 9]) |
| ; => (2 6 12) |
| |
| When no collection is provided pold returns a stateful transducer. |
| |
| (eduction (comp (pold (partitioner (part odd? identity +))) |
| (filter #(> % 2))) |
| [1 1 2 4 3 9]) |
| ; => (6 12) |
| |
| |
| Nested partitions |
| ----------------- |
| |
| As described in the example above, partitioner accepts a set |
| of partition functions. This makes it possible to divide and |
| accumulate data into any number of partitions. |
| |
| In the example below, an ordered list of artists, albums, |
| and songs is divided into three partitions, which are then |
| transformed into a list of nested maps. |
| |
| (def songs |
| [{:artist "Aphex Twin" |
| :album "On" |
| :track 1 |
| :title "On"} |
| {:artist "Aphex Twin" |
| :album "On" |
| :track 2 |
| :title "73-Yips"} |
| {:artist "Aphex Twin" |
| :album "On" |
| :track 3 |
| :title "D-Scape"} |
| {:artist "Aphex Twin" |
| :album "On" |
| :track 4 |
| :title "Xepha"} |
| {:artist "Aphex Twin" |
| :album "Blackbox Life Recorder 21f / In a Room7 F760" |
| :track 1 |
| :title "Blackbox Life Recorder 21f"} |
| {:artist "Aphex Twin" |
| :album "Blackbox Life Recorder 21f / In a Room7 F760" |
| :track 2 |
| :title "Zin2 Test5"} |
| {:artist "Aphex Twin" |
| :album "Blackbox Life Recorder 21f / In a Room7 F760" |
| :track 3 |
| :title "In a Room7 F760"} |
| {:artist "Aphex Twin" |
| :album "Blackbox Life Recorder 21f / In a Room7 F760" |
| :track 4 |
| :title "Blackbox Life Recorder 22 (Parallax mix)"} |
| {:artist "Squarepusher" |
| :album "Welcome to Europe" |
| :track 1 |
| :title "Welcome to Europe"} |
| {:artist "Squarepusher" |
| :album "Welcome to Europe" |
| :track |
| :title "Hanningfield Window"} |
| {:artist "Squarepusher" |
| :album "Welcome to Europe" |
| :track 3 |
| :title "Exciton"} |
| {:artist "Autechre" |
| :album "Anti" |
| :track 1 |
| :title |
| "Lost"} |
| {:artist"Autechre" |
| :album "Anti" |
| :track 2 |
| :title "Djarum"} |
| {:artist "Autechre" |
| :album "Anti" |
| :track 3 |
| :title "Flutter"}]) |
| |
| (defn- make-partitioner |
| [] |
| (partitioner |
| (part :artist |
| (fn [{:keys [artist]}] |
| {:artist artist |
| :albums []}) |
| #(update-in %1 [:albums] conj %2)) |
| |
| (part :album |
| (fn [{:keys [album]}] |
| {:title album |
| :songs []}) |
| #(update-in %1 [:songs] conj %2)) |
| |
| (part :track |
| (fn [{:keys [title]}] |
| title)))) |
| |
| (pold (make-partitioner) songs) |
| ; => [{:artist "Aphex Twin", :albums [{:title "On" |
| ; :songs ["On"... |
| |
| |
| References |
| ------------------------------------------------------------ |
| [1]: Clojars |
| |
| |
| Links |
| ------------------------------------------------------------ |
| main.zip |
| GitHub |