add indexed-vals
This commit is contained in:
parent
8d5f39a861
commit
c233fb7e9d
3 changed files with 16 additions and 7 deletions
|
|
@ -1,5 +1,6 @@
|
|||
## 1.0.4-SNAPSHOT
|
||||
|
||||
* Add `indexed-vals` navigator, a variant of `INDEXED-VALS` that allows for a customized start index.
|
||||
* Bug fix: Fix `INDEXED-VALS` invalidly overwriting elements in some transforms involving multiple index changes
|
||||
|
||||
## 1.0.3
|
||||
|
|
|
|||
|
|
@ -995,14 +995,14 @@
|
|||
)))
|
||||
|
||||
(defnav
|
||||
^{:doc "Navigate to [index elem] pairs for each element in a sequence. Changing index in transform
|
||||
has same effect as `index-nav`. Indices seen during transform take into account any shifting
|
||||
from prior sequence elements changing indices."}
|
||||
INDEXED-VALS
|
||||
[]
|
||||
^{:doc "Navigate to [index elem] pairs for each element in a sequence. The sequence will be indexed
|
||||
starting from `start`. Changing index in transform has same effect as `index-nav`. Indices seen
|
||||
during transform take into account any shifting from prior sequence elements changing indices."}
|
||||
indexed-vals
|
||||
[start]
|
||||
(select* [this structure next-fn]
|
||||
;; could be more efficient with a primitive mutable field
|
||||
(let [i (i/mutable-cell -1)]
|
||||
(let [i (i/mutable-cell (dec start))]
|
||||
(doseqres NONE [e structure]
|
||||
(i/update-cell! i inc)
|
||||
(next-fn [(i/get-cell i) e])
|
||||
|
|
@ -1012,7 +1012,8 @@
|
|||
(reduce
|
||||
(fn [s e]
|
||||
(let [curri (first (i/get-cell indices))
|
||||
[newi newe] (next-fn [curri e])]
|
||||
[newi* newe] (next-fn [(+ start curri) e])
|
||||
newi (- newi* start)]
|
||||
(i/update-cell!
|
||||
indices
|
||||
(fn [ii]
|
||||
|
|
@ -1029,6 +1030,11 @@
|
|||
structure
|
||||
))))
|
||||
|
||||
(def
|
||||
^{:doc "`indexed-vals` with a starting index of 0."}
|
||||
INDEXED-VALS
|
||||
(indexed-vals 0))
|
||||
|
||||
(defrichnav
|
||||
^{:doc "Navigates to result of running `afn` on the currently navigated value."}
|
||||
view
|
||||
|
|
|
|||
|
|
@ -1626,6 +1626,8 @@
|
|||
(is (= [:a :b :c :d :e] (transform [s/INDEXED-VALS s/FIRST odd?] inc data)))
|
||||
(is (= [0 2 2 4] (transform [s/INDEXED-VALS s/LAST odd?] inc [0 1 2 3])))
|
||||
(is (= [0 1 2 3] (transform [s/INDEXED-VALS (s/collect-one s/LAST) s/FIRST] (fn [i _] i) [2 1 3 0])))
|
||||
(is (= [-1 0 1 2 3] (transform [(s/indexed-vals -1) (s/collect-one s/LAST) s/FIRST] (fn [i _] i) [3 -1 0 2 1])))
|
||||
(is (= [[1 :a] [2 :b] [3 :c]] (select (s/indexed-vals 1) [:a :b :c])))
|
||||
))
|
||||
|
||||
#?(:clj
|
||||
|
|
|
|||
Loading…
Reference in a new issue