Ep 051: Maps! Maps! Maps!

Play Episode

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 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:

Related episodes:

Links:

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})