From 023ca6043ed33be74f287364bab75d13ce7392e7 Mon Sep 17 00:00:00 2001 From: Christophe Grand Date: Thu, 19 Oct 2017 11:38:19 -0500 Subject: [PATCH] Fix issue with iterator When there was only 1-item produced by an aggregating xform .hasNext was returning false. --- project.clj | 2 +- src/net/cgrand/xforms.cljc | 18 +++++++++++------- test/net/cgrand/xforms_test.cljc | 2 ++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/project.clj b/project.clj index 8ba2618..cafbad6 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject net.cgrand/xforms "0.12.1" +(defproject net.cgrand/xforms "0.12.2" :description "Extra transducers for Clojure" :url "https://github.com/cgrand/xforms" :license {:name "Eclipse Public License" diff --git a/src/net/cgrand/xforms.cljc b/src/net/cgrand/xforms.cljc index 08df58c..f5dc0cf 100644 --- a/src/net/cgrand/xforms.cljc +++ b/src/net/cgrand/xforms.cljc @@ -479,13 +479,17 @@ 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)) - (do - (rf nil) - false)))] + (and @vopen + (if (.hasNext src-iterator) + (let [acc (rf nil (.next src-iterator))] + (when (reduced? acc) + (rf nil) + (vreset! vopen false)) + (recur)) + (do + (rf nil) + (vreset! vopen false) + (recur)))))] (reify java.util.Iterator (hasNext [_] (ensure-next)) diff --git a/test/net/cgrand/xforms_test.cljc b/test/net/cgrand/xforms_test.cljc index 9e6d0c7..708d0a5 100644 --- a/test/net/cgrand/xforms_test.cljc +++ b/test/net/cgrand/xforms_test.cljc @@ -92,6 +92,8 @@ #?(:clj (deftest iterator + (is (true? (.hasNext (x/iterator x/count (.iterator (range 5)))))) + (is (is (= [5] (iterator-seq (x/iterator x/count (.iterator (range 5))))))) (is (= [[0 1] [1 2] [2 3] [3 4] [4]] (iterator-seq (x/iterator (x/partition 2 1 nil) (.iterator (range 5))))))) (deftest window-by-time