From d4f0280bb50d8cc53c3a5dfe24b17fe7701b4e43 Mon Sep 17 00:00:00 2001 From: Christophe Grand Date: Thu, 5 Jan 2017 15:40:46 +0100 Subject: [PATCH] use macros/replace --- project.clj | 2 +- src/net/cgrand/xforms.cljc | 118 +++++++++++++++++++------------------ 2 files changed, 63 insertions(+), 57 deletions(-) diff --git a/project.clj b/project.clj index 2c94491..7a42103 100644 --- a/project.clj +++ b/project.clj @@ -5,4 +5,4 @@ :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.8.0"] [org.clojure/clojurescript "1.9.293"] - [net.cgrand/macrovich "0.1.0"]]) + [net.cgrand/macrovich "0.2.0"]]) diff --git a/src/net/cgrand/xforms.cljc b/src/net/cgrand/xforms.cljc index 1de85a0..9de4fa6 100644 --- a/src/net/cgrand/xforms.cljc +++ b/src/net/cgrand/xforms.cljc @@ -273,62 +273,68 @@ acc))) ([acc k v] (self acc #?(:clj (clojure.lang.MapEntry. k v) :cljs [k v]))))))))))) -(defn partition - "Returns a partitioning transducer. Each partition is independently transformed using the xform transducer." - ([n] - (partition n n (into []))) - ([n step-or-xform] - (if (fn? step-or-xform) - (partition n n step-or-xform) - (partition n step-or-xform (into [])))) - ([n step pad-or-xform] - (if (fn? pad-or-xform) - (let [xform pad-or-xform] - (fn [rf] - (let [mxrf (multiplexable rf) - dq #?(:clj (java.util.ArrayDeque. n) :cljs (Queue.)) - barrier (volatile! n) - xform (comp (map #(if (identical? dq %) nil %)) xform)] - (fn - ([] (rf)) - ([acc] (.clear dq) (rf acc)) - ([acc x] - (let [b (vswap! barrier dec)] - (when (< b n) (#?(:clj .add :cljs .enqueue) dq (if (nil? x) dq x))) - (if (zero? b) - ; this transduce may return a reduced because of mxrf wrapping reduceds coming from rf - (let [acc (transduce xform mxrf acc #?(:clj dq :cljs (.getValues dq)))] - (dotimes [_ (core/min n step)] (#?(:clj .poll :cljs .dequeue) dq)) - (vswap! barrier + step) - acc) - acc))))))) - (partition n step pad-or-xform (into [])))) - ([n step pad xform] - (fn [rf] - (let [mxrf (multiplexable rf) - dq #?(:clj (java.util.ArrayDeque. n) :cljs (Queue.)) - barrier (volatile! n) - xform (comp (map #(if (identical? dq %) nil %)) xform)] - (fn - ([] (rf)) - ([acc] (if (< @barrier n) - (let [xform (comp cat (take n) xform) - ; don't use mxrf for completion: we want completion and don't want reduced-wrapping - acc (transduce xform rf acc [(.getValues dq) pad])] - (vreset! @barrier n) - (.clear dq) - acc) - acc)) - ([acc x] - (let [b (vswap! barrier dec)] - (when (< b n) (#?(:clj .add :cljs .enqueue) dq (if (nil? x) dq x))) - (if (zero? b) - ; this transduce may return a reduced because of mxrf wrapping reduceds coming from rf - (let [acc (transduce xform mxrf acc #?(:clj dq :cljs (.getValues dq)))] - (dotimes [_ (min n step)] (#?(:clj .poll :cljs .dequeue) dq)) - (vswap! barrier + step) - acc) - acc)))))))) +(macros/replace + [#?(:cljs {(java.util.ArrayDeque. n) (Queue.) + .add .enqueue + .poll .dequeue}) + #?(:clj {(.getValues dq) dq})] + + (defn partition + "Returns a partitioning transducer. Each partition is independently transformed using the xform transducer." + ([n] + (partition n n (into []))) + ([n step-or-xform] + (if (fn? step-or-xform) + (partition n n step-or-xform) + (partition n step-or-xform (into [])))) + ([n step pad-or-xform] + (if (fn? pad-or-xform) + (let [xform pad-or-xform] + (fn [rf] + (let [mxrf (multiplexable rf) + dq (java.util.ArrayDeque. n) + barrier (volatile! n) + xform (comp (map #(if (identical? dq %) nil %)) xform)] + (fn + ([] (rf)) + ([acc] (.clear dq) (rf acc)) + ([acc x] + (let [b (vswap! barrier dec)] + (when (< b n) (.add dq (if (nil? x) dq x))) + (if (zero? b) + ; this transduce may return a reduced because of mxrf wrapping reduceds coming from rf + (let [acc (transduce xform mxrf acc (.getValues dq))] + (dotimes [_ (core/min n step)] (.poll dq)) + (vswap! barrier + step) + acc) + acc))))))) + (partition n step pad-or-xform (into [])))) + ([n step pad xform] + (fn [rf] + (let [mxrf (multiplexable rf) + dq (java.util.ArrayDeque. n) + barrier (volatile! n) + xform (comp (map #(if (identical? dq %) nil %)) xform)] + (fn + ([] (rf)) + ([acc] (if (< @barrier n) + (let [xform (comp cat (take n) xform) + ; don't use mxrf for completion: we want completion and don't want reduced-wrapping + acc (transduce xform rf acc [(.getValues dq) pad])] + (vreset! @barrier n) + (.clear dq) + acc) + acc)) + ([acc x] + (let [b (vswap! barrier dec)] + (when (< b n) (.add dq (if (nil? x) dq x))) + (if (zero? b) + ; this transduce may return a reduced because of mxrf wrapping reduceds coming from rf + (let [acc (transduce xform mxrf acc (.getValues dq))] + (dotimes [_ (min n step)] (.poll dq)) + (vswap! barrier + step) + acc) + acc))))))))) (defn reductions "Transducer version of reductions. There's a difference in behavior when init is not provided: (f) is used.