不分块的`sequence`版本

问题描述

我想要一个sequence的版本,它不对32个元素进行分块。目前,此代码输出

(def peek #(doto % (print " ")))
(def pause #(do (Thread/sleep 10)
                %))

(take 2 (->> (range 100)
             (sequence (comp (map peek)
                             (map pause)
                             (map inc)))))

;; prints 0 1 2 3 4 <..etc..> 32
;; => (0,1)

我想要一个版本,以便它仅迭代所需的元素

(take 2 (->> (range 100)
             (iter-sequence  (comp (map peek)
                             (map pause)
                             (map inc)))))

;; prints 0 1
;; => (0,1)

有没有办法做到这一点?

解决方法

为了使它正常工作,我不得不更改几件事。首先是剪切并粘贴sequence代码,并将clojure.lang.RT/chunkIteratorSeq替换为公开公共构造方法的clojure.lang.IteratorSeq替代版本。

原因是clojure.lang.IteratorSeq/create对L27上的iter.next()进行了检查,如果源被阻塞,它将被阻塞。

(defn seqiter
  {:added "1.0"
   :static true}
  ([coll] coll)
  ([xform coll]
   (IteratorSeq.
    (TransformerIterator/create xform (clojure.lang.RT/iter coll))))
  ([xform coll & colls]
   (IteratorSeq.
    (TransformerIterator/createMulti
     xform
     (map #(clojure.lang.RT/iter %) (cons coll colls))))))