specter

Matthew Davidson 2022-05-17T09:07:48.882329Z

OK, I’m trying Specter out, and I can’t figure out how to make this transform happen. I’ve got a two-level map containing some vecs of numbers, and I want to replace the middle level with the set intersection of the vecs. How do I make:

(def example {"top1" {"mid1" [1 2 3]
                      "mid2" [2 3 4]
                      "mid3" [3 4 5]}
              "top2" {"mid4" [1 2 3]
                      "mid5" [2 3 4]
                      "mid6" [3 4 5]}})
turn into something like:
{"top1" #{3}
 "top2" #{3}}
?

Matthew Davidson 2022-05-17T09:11:59.789799Z

And how would I filter out some of the “mid*” keys if necessary?

Matthew Davidson 2022-05-17T09:43:18.761289Z

Closest I’ve come so far is something like:

(transform [MAP-VALS]
           (fn [m]
             (->> m
                  (select MAP-VALS)
                  (reduce (fn rf [s v]
                            (set/intersection (set s) (set v))))))
           example)
but it takes two stages and feels un-Specter-y

Lucy Wang 2022-07-14T02:43:34.842069Z

my 2c:

(defn shrink-inner-map [m]
    (->> m
         (sp/select [sp/MAP-VALS (sp/view set)])
         (apply clojure.set/intersection)
         ))

  (sp/transform [sp/MAP-VALS] shrink-inner-map example)

isak 2022-05-17T18:38:46.389049Z

(transform
  [MAP-VALS (collect MAP-VALS (view set))]
  (fn [sets _] (apply set/intersection sets))
  example)
@kingmob ^ A little more spectery, I think, but maybe someone can do better.