From 51b61f388906f0df3e3bef30a37327a72fcbeef7 Mon Sep 17 00:00:00 2001 From: Christophe Grand Date: Wed, 18 Oct 2017 14:39:50 -0500 Subject: [PATCH] Add the iterator transducing context --- src/net/cgrand/xforms.cljc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/net/cgrand/xforms.cljc b/src/net/cgrand/xforms.cljc index c5047b2..d6b785e 100644 --- a/src/net/cgrand/xforms.cljc +++ b/src/net/cgrand/xforms.cljc @@ -468,6 +468,31 @@ (vreset! vi (let [i (inc i)] (if (= n i) 0 i))) (rf acc (f (vreset! vwacc (f (invf wacc x') x)))))))))))) +#?(:clj + (defn iterator + "Iterator transducing context, returns an iterator on the transformed data. + Equivalent to (.iterator (eduction xform (iterator-seq src-iterator))) except there's is no buffering on values (as in iterator-seq), + This buffering may cause problems when mutable objects are returned by the src-iterator." + [xform ^java.util.Iterator src-iterator] + (let [NULL (Object.) + dq (java.util.ArrayDeque. 32) + rf (xform (fn ([acc] acc) ([acc x] (.push dq (if (some? x) x NULL)) acc))) + vopen (volatile! true) + ensure-next #(or (some? (.peek dq)) + (if (and @vopen (.hasNext src-iterator)) + (let [acc (rf nil (.next src-iterator))] + (when (reduced? acc) (vreset! vopen false)) + (recur)) + false))] + (reify java.util.Iterator + (hasNext [_] + (ensure-next)) + (next [_] + (if (ensure-next) + (let [x (.poll dq)] + (if (identical? NULL x) nil x)) + (throw (java.util.NoSuchElementException.)))))))) + #?(:clj (defn window-by-time "ALPHA