Fork me on GitHub
#specter
<
2016-11-07
>
tianshu08:11:13

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!

nathanmarz12:11:21

@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))

nathanmarz12:11:00

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))

nathanmarz12:11:47

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

nathanmarz12:11:15

(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)))
      )))

nathanmarz12:11:22

I'll add that to the next version

nathanmarz19:11:05

I haven't put up a website yet