diff --git a/README.md b/README.md index 3ad1085..0af7193 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ smart people at [Hashrocket](http://hashrocket.com/). ### clojure +- [Aggregation Using merge-with](clojure/aggregation-using-merge-with.md) - [Evaluate One Liners With lein-exec](clojure/evaluate-one-liners-with-lein-exec.md) - [Expanding Macros](clojure/expanding-macros.md) - [Open JavaDocs](clojure/open-javadocs.md) diff --git a/clojure/aggregation-using-merge-with.md b/clojure/aggregation-using-merge-with.md new file mode 100644 index 0000000..5698e81 --- /dev/null +++ b/clojure/aggregation-using-merge-with.md @@ -0,0 +1,22 @@ +# Aggregation Using merge-with + +Clojure provides the `merge-with` function as a way of conjoining a series +of maps. You must provide `merge-with` a function that it can use to merge +two values for matching keys. For instance, imagine you have a bunch of maps +that contain counts for entities identified by keywords. You can consolidate +the sum of all the counts into a single map using the `merge-with` function +combined with the `+` function. + +```clojure +> (merge-with + {:a 1 :b 3} {:b 2 :c 3} {:c 1 :d 4}) +{:a 1, :b 5, :c 4, :d 4} +``` + +For different kinds of data, a different function argument may be more +appropriate. For instance, aggregating lists instead of integers calls for +the `concat` function: + +```clojure +> (merge-with concat {:a '(1 2) :b '(3 4)} {:c '(3 4) :a '(5 4 1)}) +{:a (1 2 5 4 1), :b (3 4), :c (3 4)} +```