Iterator, seqs, and chunking is indeed the key to this issue. The change in question is http://dev.clojure.org/jira/browse/CLJ-1669, which made iterator-seq's chunked. In general, this should not be problematic with most Java iterators, however there is a iterator implementation pattern where the identical object is returned (and mutated) on every call to next() on the iterator. This is done in Java for performance reasons (reuses a single mutable object rather than creating N objects). Because iterator-seq now chunks, it will obtain 32 elements at a time, but they will all be the identical object, so you'll see the state of the 32'nd object for all of them.
iterator-seq intentionally does not handle this iterator pattern (this is in the docstring and was introduced via http://dev.clojure.org/jira/browse/CLJ-1738). If you need to control iteration to one at a time (non-chunked), then there are several options: 1. Use loop/recur and explicitly handle each object one at a time. Sounds like you've got that one. 2. Implement your own lazy-seq that does not chunk. (defn iter-seq [iter f] (if (.hasNext iter) (lazy-seq (cons (f (.next iter)) (iter-seq iter f))))) 3. Use transducers which will also pull a single element at a time in current transducible contexts. If you want to use it as a seq, this means invoking (defn transform [^ArchiveRecord r] (let [header (.getHeader r) mime (.getMimetype header)] (if (plain-text? mime) (println "got " (.available r))))) (defn mapper-map [this ^Text key warc-value ^MapContext context] (sequence (map transform) warc-value)) 4. In this particular case, since you're only doing side effects, something like dorun would maybe be better. 5. (WARNING - may be removed!) You can still access the old iterator-seq impementation in the Java impl for now: (clojure.lang.IteratorSeq/create iter) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
