Fork me on GitHub
#specter
<
2018-03-02
>
frenata16:03:14

If I want to select some substructure out of a nested map, rather than just the leaves, what's the best way to do that with specter? IE, I have {:foo 1 :bar {:baz 2 :bat 3}}, and I want to select out {:bar {:baz 2}}. New to the library and just poking around. Thought subselect or filterer might work, but at least the way I'm using them they aren't quite right.

nathanmarz16:03:57

@andrew354 it depends on the use case, but generally the most straightforward approach is to remove what you don't want

nathanmarz16:03:01

(setval (multi-path :foo [:bar :bat]) NONE data)

frenata16:03:41

Ah, so naming the paths of things you want to get rid of.

frenata16:03:02

Unfortunately I think in my actual use-case, I want to keep a fairly small part of the structure, but I'll see if this approach will work.

nathanmarz16:03:03

@andrew354 another approach that explicitly selects the keys you want:

nathanmarz16:03:10

(defdynamicnav viewed [path viewnav]
  (transformed path #(select-any viewnav %)))

(select-any [(submap [:bar]) (viewed :bar (submap [:baz]))] data)

frenata16:03:28

Interesting. I may try both approaches and see what is most clear.

nathanmarz16:03:39

could make a helper that takes in a list of keyword paths and produces the navigation

nathanmarz16:03:00

e.g. (select-any (keep-keyword-paths [:bar :baz]) data)

schmee16:03:59

I think that viewed with a bit of polish could go into specter core 🙂