Each week, we discuss a different topic about Clojure and functional programming.
If you have a question you'd like us to discuss, tweet @clojuredesign, send an email to [email protected], or join the #clojuredesign-podcast channel on the Clojurians Slack.
This week, our topic is: "Maps! Maps! Maps!" We discuss maps and their useful features, including a key distinction that we couldn't live without.
"Working with Clojure makes you feel like you're living in the future!""Maps are bags of dimensions.""The namespace of the key is the entity, the name is the attribute, and the value is the value.""Flatter maps make it so you end up writing less code."Time Log series:015: Finding the Time016: When 8 - 1 = 6017: Data, at Your Service018: Did I Work Late on Tuesday?019: Dazed by Weak Weeks020: Data Dessert049: Keywords! Keywords! Keywords!Love Letter To Clojure (Part 1) - Gene Kim;; Player records: one nested, one with rich keys.
(def players-nested
[{:player {:id 123
:name "Russell"
:position :point-guard}
:team {:id 432
:name "Durham Denizens"
:division :eastern}}
{:player {:id 124
:name "Frank"
:position :midfield}
:team {:id 432
:name "Durham Denizens"
:division :eastern}}])
(def players-rich
[{:player/id 123
:player/name "Russell"
:player/position :point-guard
:team/id 432
:team/name "Durham Denizens"
:team/division :eastern}
{:player/id 124
:player/name "Frank"
:player/position :midfield
:team/id 432
:team/name "Durham Denizens"
:team/division :eastern}])
;; Extract player and team id, along with team name
; Nested
(defn extract
[player]
(let [{:keys [player team]} player]
{:player (select-keys player [:id])
:team (select-keys team [:id :name])}))
#_(map extract players-nested)
; ({:player {:id 123}, :team {:id 432, :name "Durham Denizens"}}
; {:player {:id 124}, :team {:id 432, :name "Durham Denizens"}})
; Rich
#_(map #(select-keys % [:player/id :team/id :team/name]) players-rich)
; ({:player/id 123, :team/id 432, :team/name "Durham Denizens"}
; {:player/id 124, :team/id 432, :team/name "Durham Denizens"})
;; Sort by team name and then player name
; Nested
#_(sort-by (juxt #(-> % :team :name) #(-> % :player :name)) players-nested)
; ({:player {:id 124, :name "Frank", :position :midfield},
; :team {:id 432, :name "Durham Denizens", :division :eastern}}
; {:player {:id 123, :name "Russell", :position :point-guard},
; :team {:id 432, :name "Durham Denizens", :division :eastern}})
; Rich
#_(sort-by (juxt :team/name :player/name) players-rich)
; ({:player/id 124,
; :player/name "Frank",
; :player/position :midfield,
; :team/id 432,
; :team/name "Durham Denizens",
; :team/division :eastern}
; {:player/id 123,
; :player/name "Russell",
; :player/position :point-guard,
; :team/id 432,
; :team/name "Durham Denizens",
; :team/division :eastern})