From 3750dd73f5cb709a700f1249540203d3a3e2e471 Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Thu, 26 Feb 2015 15:48:10 -0500 Subject: [PATCH] rewrite filter+ancestry to be purely functional and stop using transients incorrectly --- src/clj/com/rpl/specter/impl.clj | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/clj/com/rpl/specter/impl.clj b/src/clj/com/rpl/specter/impl.clj index df02295..296fc05 100644 --- a/src/clj/com/rpl/specter/impl.clj +++ b/src/clj/com/rpl/specter/impl.clj @@ -119,21 +119,17 @@ )) (defn- filter+ancestry [afn aseq] - (let [aseq (vec aseq) - seqret (transient []) - ;; transient maps are broken, e.g.: - ;; (def m (transient {})) - ;; (doseq [i (range 9)] (assoc! m i i)) - ;; (persistent! m) --> only has 8 elements! - mapret (mutable-cell {})] - (doseq [i (range (count aseq)) - :let [e (get aseq i)]] - (when (afn e) - (conj! seqret e) - (set-cell! mapret (assoc (get-cell mapret) (-> seqret count dec) i)) - )) - [(persistent! seqret) (get-cell mapret)] - )) + (let [aseq (vec aseq)] + (reduce (fn [[s m :as orig] i] + (let [e (get aseq i) + pos (count s)] + (if (afn e) + [(conj s e) (assoc m pos i)] + orig + ))) + [[] {}] + (range (count aseq)) + ))) (defn key-select [akey vals structure next-fn] (next-fn vals (get structure akey)))