Skip to content

Instantly share code, notes, and snippets.

@jetmind
Last active May 16, 2024 13:52
Show Gist options
  • Save jetmind/da0822741af709335619375b430bd71d to your computer and use it in GitHub Desktop.
Save jetmind/da0822741af709335619375b430bd71d to your computer and use it in GitHub Desktop.
(defn group-by
"(group-by first second [[1 3] [1 4] [2 5]]) => {1 [3 4], 2 [5]}
(group-by first second + 0 [[1 3] [1 4] [2 5]]) => {1 7, 2 5}
(group-by first second [[1 [3]] [1 [4]] [2 [5]]]) => {1 [[3] [4]], 2 [[5]]}
(group-by first second concat [[1 [3]] [1 [4]] [2 [5]]]) => {1 (3 4), 2 (5)}
(group-by first second into [[1 [3]] [1 [4]] [2 [5]]]) => {1 [3 4], 2 [5]}
(group-by first second into [] [[1 [3]] [1 [4]] [2 [5]]]) => {1 [3 4], 2 [5]}
(group-by first second into () [[1 [3]] [1 [4]] [2 [5]]]) => {1 (4 3), 2 (5)}
;; as filter:
(group-by first any? second even? conj () [[1 3] [1 4] [2 5]]) => {1 (4)}
;; as reducer (see index-by below):
(group-by first any? second even? max 0 [[1 3] [1 6] [1 4] [2 5]] => {1 6})"
([kf coll] (clojure.core/group-by kf coll))
([kf vf coll] (group-by kf vf conj [] coll))
([kf vf rf coll] (group-by kf vf rf [] coll))
([kf vf rf init coll]
(->> coll
(reduce
(fn [m x]
(let [k (kf x)]
(assoc! m k (rf (get m k init) (vf x)))))
(transient {}))
(persistent!)))
([kf kpred vf vpred rf init coll]
(->> coll
(reduce
(fn [m x]
(let [k (kf x)]
(if-not (kpred k)
m
(let [v (vf x)]
;; no empty collections as a 'side effect':
(if-not (vpred v)
m
(assoc! m k (rf (get m k init) v)))))))
(transient {}))
(persistent!))))
(defn index-by
"(index-by first second [[1 3] [1 4] [2 5]]) => {1 4, 2 5}"
([kf coll]
(reduce
(fn [acc v] (assoc acc (kf v) v))
{} coll))
([kf vf coll]
(reduce
(fn [acc v] (assoc acc (kf v) (vf v)))
{} coll))
([kf kpred vf vpred coll]
(group-by kf kpred vf vpred right nil coll))
([kf kpred vf vpred default coll]
(group-by kf kpred vf vpred right default coll)))
@jetmind
Copy link
Author

jetmind commented Apr 20, 2024

(def inp [[#:outnordic.article{:number "PL11051"} #:outnordic.product{:number "FS151670"}]
          [#:outnordic.article{:number "A061157"} #:outnordic.product{:number "FS147898"}]])

(group-by #(-> % first :outnordic.article/number) #(-> % second :outnordic.product/number) inp)

{"PL11051" ["FS151670"], "A061157" ["FS147898"]}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment