rewrite filter+ancestry to be purely functional and stop using transients incorrectly

This commit is contained in:
Nathan Marz 2015-02-26 15:48:10 -05:00
parent 34cbf6b6b4
commit 3750dd73f5

View file

@ -119,21 +119,17 @@
)) ))
(defn- filter+ancestry [afn aseq] (defn- filter+ancestry [afn aseq]
(let [aseq (vec aseq) (let [aseq (vec aseq)]
seqret (transient []) (reduce (fn [[s m :as orig] i]
;; transient maps are broken, e.g.: (let [e (get aseq i)
;; (def m (transient {})) pos (count s)]
;; (doseq [i (range 9)] (assoc! m i i)) (if (afn e)
;; (persistent! m) --> only has 8 elements! [(conj s e) (assoc m pos i)]
mapret (mutable-cell {})] orig
(doseq [i (range (count aseq)) )))
:let [e (get aseq i)]] [[] {}]
(when (afn e) (range (count aseq))
(conj! seqret e) )))
(set-cell! mapret (assoc (get-cell mapret) (-> seqret count dec) i))
))
[(persistent! seqret) (get-cell mapret)]
))
(defn key-select [akey vals structure next-fn] (defn key-select [akey vals structure next-fn]
(next-fn vals (get structure akey))) (next-fn vals (get structure akey)))