Fork me on GitHub
#specter
<
2018-08-31
>
benzap15:08:24

I figured it out!

idiomancy21:08:40

hmm, interesting. I'm trying to select the meta from some objects and use that in a transformation step. It seems like when I put meta in the path, it acts as an identity function, returning the same values

idiomancy21:08:02

oh, I see. there's a specific META navigator

idiomancy22:08:34

Okay. So, for each element in this collection, I want to take its metadata key if it has metadata, or the key will be in a map as the second element of the list. so, data looks like this:

[^{:key "hello"} [:div]
                          [:div {:key "world"}]
                          [:div [:subdiv]]]
I want to select the keys, if they exist, for each. So, something like
(s/select 
  [s/ALL
   (s/if-path [s/META :key]
              [s/META :key]
              [#(< 1 (count %)) (s/nthpath 1) map? :key])]
  [^{:key "hello"} [:div] 
                   [:div {:key "world"}]
                   [:div [:subdiv]]])
=> ["hello" "world" nil]
but if-path isn't doing what I thought. if-path tests the first element, and if it succeeds, uses that path for all of the elements. How do I do what I'm trying to do?

idiomancy22:08:58

I ended up doing it with a multi-path and a filter for now... is there a better way?

idiomancy22:08:32

[s/ALL
 (s/multi-path [s/META :key]
               [#(< 1 (count %))
                (s/nthpath 1)
                map? :key])
 some?]
and then I just manually select the first element of the path returned collect, because I don't know how to bring it back to a single element 😂