Make the (fn [rf] ...) in by-key to not depend on function equality because it creates headaches when deserializing the function in aother env.

This commit is contained in:
Christophe Grand 2016-04-21 16:14:48 +02:00
parent 45af15c69d
commit c913617aa1

View file

@ -142,39 +142,44 @@
Partitions contain the \"value part\" (as returned by vfn) of each item. Partitions contain the \"value part\" (as returned by vfn) of each item.
The resulting transformed items are wrapped back into a \"pair\" using the pair function. The resulting transformed items are wrapped back into a \"pair\" using the pair function.
Default values for kfn, vfn and pair are first, second (or identity if kfn is specified) and vector." Default values for kfn, vfn and pair are first, second (or identity if kfn is specified) and vector."
([xform] (by-key key' val' vector xform)) ([xform] (by-key nil nil vector xform))
([kfn xform] (by-key kfn identity vector xform)) ([kfn xform] (by-key kfn identity vector xform))
([kfn vfn xform] (by-key kfn vfn vector xform)) ([kfn vfn xform] (by-key kfn vfn vector xform))
([kfn vfn pair xform] ([kfn vfn pair xform]
(fn [rf] (let [pair (if (identical? vector pair) ::default pair)]
(let [make-rf (if pair (fn [rf]
(if-some [rf (when (identical? vector pair) (some-kvrf rf))] (let [make-rf (cond
(fn [k] (fn ([acc] acc) ([acc v] (rf acc k v)))) (nil? pair) (constantly (multiplexable rf))
(fn [k] (fn ([acc] acc) ([acc v] (rf acc (pair k v)))))) (= ::default pair)
(constantly (multiplexable rf))) (if-some [rf (some-kvrf rf)]
m (volatile! (transient {}))] (fn [k] (fn ([acc] acc) ([acc v] (rf acc k v))))
(if (and (= key' kfn) (= val' vfn)) (fn [k] (fn ([acc] acc) ([acc v] (rf acc (vector k v))))))
(kvrf self :else (fn [k] (fn ([acc] acc) ([acc v] (rf acc (pair k v))))))
([] (rf)) m (volatile! (transient {}))]
([acc] (rf (clj/reduce (fn [acc krf] (krf acc)) acc (vals (persistent! @m))))) (if (and (nil? kfn) (nil? vfn))
([acc x] (kvrf self
(self acc (key' x) (val' x))) ([] (rf))
([acc k v] ([acc] (rf (clj/reduce (fn [acc krf] (krf acc)) acc (vals (persistent! @m)))))
(let [krf (or (get @m k) (doto (xform (make-rf k)) (->> (vswap! m assoc! k)))) ([acc x]
acc (krf acc v)] (self acc (key' x) (val' x)))
(when (reduced? acc) ; complete? ([acc k v]
(vswap! m assoc! k noprf)) (let [krf (or (get @m k) (doto (xform (make-rf k)) (->> (vswap! m assoc! k))))
(unreduced acc)))) acc (krf acc v)]
(fn (when (reduced? acc) ; complete?
([] (rf)) (vswap! m assoc! k noprf))
([acc] (rf (clj/reduce (fn [acc krf] (krf acc)) acc (vals (persistent! @m))))) (unreduced acc))))
([acc x] (let [kfn (or kfn key')
(let [k (kfn x) vfn (or vfn val')]
krf (or (get @m k) (doto (xform (make-rf k)) (->> (vswap! m assoc! k)))) (fn
acc (krf acc (vfn x))] ([] (rf))
(when (reduced? acc) ; complete? ([acc] (rf (clj/reduce (fn [acc krf] (krf acc)) acc (vals (persistent! @m)))))
(vswap! m assoc! k noprf)) ([acc x]
(unreduced acc))))))))) (let [k (kfn x)
krf (or (get @m k) (doto (xform (make-rf k)) (->> (vswap! m assoc! k))))
acc (krf acc (vfn x))]
(when (reduced? acc) ; complete?
(vswap! m assoc! k noprf))
(unreduced acc)))))))))))
(defn- spawn (defn- spawn
"Every n items, spawns a new pipeline." "Every n items, spawns a new pipeline."