Clojure: Destructuring group-by's output
One of my favourite features of Clojure is that it allows you to destructure a data structure into values that are a bit easier to work with.
I often find myself referring to Jay Fields' article which contains several examples showing the syntax and is a good starting point.
One recent use of destructuring I had was where I was working with a vector containing events like this:
user> (def events [{:name "e1" :timestamp 123} {:name "e2" :timestamp 456} {:name "e3" :timestamp 789}])
I wanted to split the events in two - those containing events with a timestamp greater than 123 and those less than or equal to 123.
After remembering that the function I wanted was http://clojuredocs.org/clojure_core/1.2.0/clojure.core/group-by and not http://clojuredocs.org/clojure_core/1.2.0/clojure.core/partition-by (I always make that mistake!) I had the following:
user> (group-by #(> (->> % :timestamp) 123) events)
{false [{:name "e1", :timestamp 123}], true [{:name "e2", :timestamp 456} {:name "e3", :timestamp 789}]}
I wanted to get 2 vectors that I could pass to the web page and this is fairly easy with destructuring:
user> (let [{upcoming true past false} (group-by #(> (->> % :timestamp) 123) events)]
(println upcoming) (println past))
[{:name e2, :timestamp 456} {:name e3, :timestamp 789}]
[{:name e1, :timestamp 123}]
nil
Simple!
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.