Skip to content

Instantly share code, notes, and snippets.

@beoliver
Created July 3, 2017 10:30
Show Gist options
  • Save beoliver/3e5ddfed4ebdf83ef49f23581cacbd7f to your computer and use it in GitHub Desktop.
Save beoliver/3e5ddfed4ebdf83ef49f23581cacbd7f to your computer and use it in GitHub Desktop.
(defn invert-one-to-one
"returns a one-to-one mapping"
[m]
(persistent!
(reduce (fn [m [k v]] (assoc! m v k)) (transient {}) m)))
(defn invert-many-to-one
"returns a one-to-many mapping"
([m] (invert-many-to-one #{} m))
([to m]
(persistent!
(reduce (fn [m [k v]]
(assoc! m v (conj (get m v to) k)))
(transient {}) m))))
(defn invert-one-to-many
"returns a many-to-one mapping"
[m]
(persistent!
(reduce (fn [m [k vs]] (reduce (fn [m v] (assoc! m v k)) m vs))
(transient {}) m)))
(defn invert-many-to-many
"returns a many-to-many mapping"
([m] (invert-many-to-many #{} m))
([to m]
(persistent!
(reduce (fn [m [k vs]]
(reduce (fn [m v]
(assoc! m v (conj (get m v to) k))) m vs))
(transient {}) m))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment