Ep 051: Maps! Maps! Maps!
► Play EpisodeEach 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 feedback@clojuredesign.club, 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.
Selected quotes:
- "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."
Related episodes:
- Time Log series:
- 049: Keywords! Keywords! Keywords!
Links:
- Love Letter To Clojure (Part 1) - Gene Kim
Code sample:
;; 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})