diff --git a/resources/koans.clj b/resources/koans.clj index 6f35a56..89c155e 100644 --- a/resources/koans.clj +++ b/resources/koans.clj @@ -216,7 +216,7 @@ {:last-name "Smith" :id 1}] 2 [{:name "Mike" :id 2}]} nil - {:nauty-list [{:name "Jimmy" :bad true} - {:name "Joe" :bad true}] + {:naughty-list [{:name "Jimmy" :bad true} + {:name "Joe" :bad true}] :nice-list [{:name "Jack" :bad false}]}]}] ] diff --git a/src/koans/21_group_by.clj b/src/koans/21_group_by.clj index 245a95a..bd926fc 100644 --- a/src/koans/21_group_by.clj +++ b/src/koans/21_group_by.clj @@ -4,29 +4,32 @@ (meditations - "To split a collection categorized by keys use the group-by function." + "To categorize a collection by some function, use group-by." (= __ (group-by count ["hello" "world" "foo" "bar"])) - "Sometimes you want to filter a sequence but also keep the predicate." - (= (get-odds-and-evens '(1 2 3 4 5)) - [[1 3 5] [2 4]]) + "You can simulate filter + remove in one pass" + (= (get-odds-and-evens [1 2 3 4 5]) + ((partial (juxt filter remove) odd?) [1 2 3 4 5]) + [[1 3 5] [2 4]]) "You can also group by a primary key" (= __ (group-by :id [{:id 1 :name "Bob"} - {:id 2 :name "Mike"} - {:id 1 :last-name "Smith"} ])) + {:id 2 :name "Mike"} + {:id 1 :last-name "Smith"} ])) - "but be careful when you group by non primary key" - (= {"Bob" [{:name "Bob" :id 1}], "Mike" [{:name "Mike" :id 2}], __ [{:last-name "Smith" :id 1}]} + "But be careful when you group by non-required key" + (= {"Bob" [{:name "Bob" :id 1}] + "Mike" [{:name "Mike" :id 2}] + __ [{:last-name "Smith" :id 1}]} (group-by :name [{:id 1 :name "Bob"} {:id 2 :name "Mike"} {:id 1 :last-name "Smith"}])) - "The true power of group-by is using a custom function" + "The true power of group-by comes with custom functions" (= __ - (group-by #(if (:bad %) :nauty-list :nice-list) + (group-by #(if (:bad %) :naughty-list :nice-list) [{:name "Jimmy" :bad true} {:name "Jack" :bad false} {:name "Joe" :bad true}])))