![Functional Design in Clojure artwork](https://is5-ssl.mzstatic.com/image/thumb/Podcasts113/v4/93/a5/2e/93a52ec2-151e-b60a-25e8-868e74977546/mza_4040180217548433975.png/100x100bb.jpg)
Ep 051: Maps! Maps! Maps!
Functional Design in Clojure
English - October 18, 2019 15:00 - 28 minutes - 38.6 MB - ★★★★★ - 17 ratingsTechnology Education How To tech software design functional clojure immutable geek nerd development nate Homepage Download Apple Podcasts Google Podcasts Overcast Castro Pocket Casts RSS feed
We discuss maps and their useful features, including a key distinction that we couldn't live without.
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.
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:
015: Finding the Time
016: When 8 - 1 = 6
017: Data, at Your Service
018: Did I Work Late on Tuesday?
019: Dazed by Weak Weeks
020: Data Dessert
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})