Fork me on GitHub

Hi, I'm new to specter, I'm very exciting about specter. And I'm trying to use it, does specter ship some features like threading macros? I want to use specter to do something following:

(->> {"20161106020" {:3010 {}
                       :3006 {:3 "3.10"
                              :1 "3.55"
                              :0 "18.00"}}
        "20161106021" {:3010 {:3 "3.00"}
                       :3006 {:3 "2.00"}}}

       (map (fn [kv]
              (->> (peek kv)
                   (map (fn [kv1]
                         (count (peek kv1))))
                   (reduce +))))
       (reduce *))
what I want is simplify this piece of code with specter. wonder if someone could give me an example. appreciate for any help, thanks!


@doglooksgood here's one way to do it with specter:

(defn sum [args] (reduce + args))
(reduce * (traverse [MAP-VALS (subselect MAP-VALS (view count)) (view sum)] data))


if there were a traversed navigator builder along the lines of transformed, you could do it like this:

(reduce * (traverse [MAP-VALS (traversed [MAP-VALS (view count)] +)] data))


the former (which currently works) does materialize some intermediate subsequences, while the latter would not, so the latter would be close to optimal efficiency


(defdynamicnav traversed
  "Navigates to a view of the current value by transforming with a reduction over
   the specified traversal."
  [path reduce-fn]
  (late-bound-nav [late (late-path path)
                   late-fn reduce-fn]
    (select* [this structure next-fn]
      (next-fn (reduce late-fn (compiled-traverse late structure))))
    (transform* [this structure next-fn]
      (next-fn (reduce late-fn (compiled-traverse late structure)))


I'll add that to the next version


I haven't put up a website yet