From c233fb7e9dd903a941249854abd348fc13ce7b7b Mon Sep 17 00:00:00 2001 From: nathanmarz Date: Wed, 16 Aug 2017 07:28:05 -0400 Subject: [PATCH] add indexed-vals --- CHANGES.md | 1 + src/clj/com/rpl/specter.cljc | 20 +++++++++++++------- test/com/rpl/specter/core_test.cljc | 2 ++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index fbf4f24..40895b5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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 diff --git a/src/clj/com/rpl/specter.cljc b/src/clj/com/rpl/specter.cljc index c9f5feb..d7dc472 100644 --- a/src/clj/com/rpl/specter.cljc +++ b/src/clj/com/rpl/specter.cljc @@ -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 diff --git a/test/com/rpl/specter/core_test.cljc b/test/com/rpl/specter/core_test.cljc index eab7f1a..58c015c 100644 --- a/test/com/rpl/specter/core_test.cljc +++ b/test/com/rpl/specter/core_test.cljc @@ -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