Specter 0.12.0 has been released with many new features, performance 
improvements, and bug fixes. There are a few highlights:

1. Performance of `select` has been greatly improved. Specter no longer 
creates intermediate vectors during navigation and has performance very 
close to transducers (for overlapping use cases).

2. A new `traverse` operation has been added that lets you do 
high-performance reductions over nested elements in a data structure. It 
does so without materializing any intermediate sequences. For example, this 
code adds up all the even values for :a keys in a sequence of maps:

(reduce + (traverse [ALL :a even?] [{:a 1} {:a 2 :b 3} {:a 4}]))
;; => 6

3. `multi-transform` operation has been added for doing multiple 
transformations at one time. This leads to better performance when the 
transforms overlap a lot in how they navigate to their values. For example:

(multi-transform
  [ALL
   ALL
   MAP-VALS
   (multi-path [:a (terminal inc)]
               [:b :c (terminal-val 99)])]
  data)
  


Note that this release changes the semantics of the select* path for 
navigators, so if you have custom navigators those may need to be updated. 
Otherwise, no updates are needed. See the docstring on the Navigator 
protocol for more details.


Full list of changes:


* BREAKING CHANGE: Changed semantics of `Navigator` protocol `select*` in 
order to enable very large performance improvements to `select`, 
`select-one`, `select-first`, and `select-one!`. Custom navigators will 
need to be updated to conform to the new required semantics. Codebases that 
do not use custom navigators do not require any changes. See the docstring 
on the protocol for the details. 

* Added `select-any` operation which selects a single element navigated to 
by the path. Which element returned is undefined. If no elements are 
navigated to, returns `com.rpl.specter/NONE`. This is the fastest selection 
operation.

* Added `selected-any?` operation that returns true if any element is 
navigated to.

* Added `traverse` operation which returns a reducible object of all the 
elements navigated to by the path. Very efficient.

* Added `multi-transform` operation which can be used to perform multiple 
transformations in a single traversal. Much more efficient than doing the
transformations with `transform` one after another when the transformations 
share a lot of navigation. `multi-transform` is used in conjunction with 
`terminal` and `terminal-val` – see the docstring for details.

* Huge performance improvements to `select`, `select-one`, `select-first`, 
and `select-one!`

* Huge performance improvement to `multi-path`

* Added META navigator (thanks @aengelberg)

* Added DISPENSE navigator to drop all collected values for subsequent 
navigation

* Added `collected?` macro to create a filter function which operates on 
the collected values.

* Error now thrown if a pathedfn (like filterer) is used without being 
parameterized

* Performance improvement for ALL and MAP-VALS on small maps for Clojure by 
leveraging IMapIterable interface

* Added low-level `richnav` macro for creating navigators with full 
flexibility

* Bug fix: multi-path and if-path now work properly with value collection

* Bug fix: END, BEGINNING, FIRST, LAST, and MAP-VALS now work properly on 
nil

* Bug fix: ALL and MAP-VALS now maintain the comparator of sorted maps

* Bug fix: Using value collection along with `setval` no longer throws 
exception

* Bug fix: Fix error when trying to use Specter along with AOT compilation

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

Reply via email to