Fork me on GitHub

I figured it out!


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


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


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/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?


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


 (s/multi-path [s/META :key]
               [#(< 1 (count %))
                (s/nthpath 1)
                map? :key])
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 😂