clojure-koans/src/koans/22_group_by.clj

37 lines
1.2 KiB
Clojure
Raw Normal View History

(ns koans.22-group-by
(:require [koan-engine.core :refer :all]))
2013-09-16 18:42:18 +00:00
(defn get-odds-and-evens [coll]
(let [{odds true evens false} (group-by __ coll)]
[odds evens]))
(meditations
"To categorize a collection by some function, use group-by."
2013-09-16 18:42:18 +00:00
(= __ (group-by count ["hello" "world" "foo" "bar"]))
"You can simulate filter + remove in one pass"
(= (get-odds-and-evens [1 2 3 4 5])
((juxt filter remove) odd? [1 2 3 4 5])
[[1 3 5] [2 4]])
2013-09-16 18:42:18 +00:00
"You can also group by a primary key"
(= __
(group-by :id [{:id 1 :name "Bob"}
2015-06-15 02:06:04 +00:00
{:id 2 :name "Jennifer"}
{:id 1 :last-name "Smith"} ]))
2013-09-16 18:42:18 +00:00
"But be careful when you group by a non-required key"
(= {"Bob" [{:name "Bob" :id 1}]
2015-06-15 02:06:04 +00:00
"Jennifer" [{:name "Jennifer" :id 2}]
__ [{:last-name "Smith" :id 1}]}
2013-09-16 18:42:18 +00:00
(group-by :name [{:id 1 :name "Bob"}
2015-06-15 02:06:04 +00:00
{:id 2 :name "Jennifer"}
2013-09-16 18:42:18 +00:00
{:id 1 :last-name "Smith"}]))
"The true power of group-by comes with custom functions"
2013-09-16 18:42:18 +00:00
(= __
(group-by #(if (:bad %) :naughty-list :nice-list)
2013-09-16 18:42:18 +00:00
[{:name "Jimmy" :bad true}
{:name "Jane" :bad false}
2013-09-16 18:42:18 +00:00
{:name "Joe" :bad true}])))