Specter fills in the holes in Clojure's API for manipulating immutable data, allowing data manipulation to be done concisely and with near-optimal performance. Specter is especially powerful for working with nested and recursive data.
Project link: https://github.com/nathanmarz/specter Excited to be releasing Specter 1.1.0 today. It's not often I discover how to do something new with Specter, but this release includes the `compact` navigator which utilizes a new composition technique. If you look at the JIRA for a proposed `dissoc-in` function (https://dev.clojure.org/jira/browse/CLJ-1063), you can see a discussion about whether empty subvalues should be kept or discarded. This is further complicated by the fact that `dissoc-in` must operate on vectors. Ultimately, there is no right answer, as the manipulation needs can differ from usage to usage. You may even want to remove some empty subvalues along the path but not others. The JIRA discussion looks to handle the most common use case instead of handling all use cases. Specter's paths, on the other hand, can specify much richer behavior. The new `compact` navigator allows you to concisely specify which values along the path should be removed if emptied: (setval [:a (compact :b :c)] NONE {:a {:b {:c 1}}}) ;; => {} (setval [:a (compact :b :c)] NONE {:a {:b {:c 1} :d 2}}) ;; => {:a {:d 2}} (setval [:a :b (compact :c)] NONE {:a {:b {:c 1}}}) ;; => {:a {}} It works with sequences too: (setval [1 (compact 0)] NONE [:a [:b] :c]) ;; => [:a :c] And like all navigators, it works recursively as well: (def TREE-VALUES (recursive-path [] p (if-path vector? [(compact ALL) p] STAY ))) (setval [TREE-VALUES even?] NONE [1 [2 3] [4] [5 [[6]]]]) ;; => [1 [3] [5]] `compact` is very efficient and has a beautiful implementation: https://github.com/nathanmarz/specter/blob/1.1.0/src/clj/com/rpl/specter.cljc#L1459 The new composition technique is utilizing terminal navigation points inside a reusable navigator. Terminal points were originally conceived for `multi-transform` operations, but to my pleasant surprise turn out to be very useful beyond that. I don't usually expound on releases like this, but the `compact` navigator, a composition of already existing components, excited me because it shows Specter is more powerful than even I knew. The full changelog for the release is here: https://github.com/nathanmarz/specter/blob/master/CHANGES.md -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.