Я унаследовал некоторый код, который опросает обновления, добавляя эти обновления в ленивую последовательность и обрабатывая. После обновления от clojure 1.7.0-alpha5 до любой более поздней версии код выглядит сломанным из-за chunking
ленивой последовательности. Я написал пример, чтобы показать проблему:Обработка бесконечных (Lazy) последовательностей
(defn infinite-updates
[]
(letfn [(step [n]
(lazy-seq
;; Poll for an update
(Thread/sleep 3000)
(cons n (step (rand-int 5)))))]
(lazy-seq
(step (rand-int 5)))))
;; Run with:
(doseq [t (sequence (map inc) (infinite-updates))] (println t))
Проект был на Clojure 1.7.0-alpha5 и работает как например: каждые 3 секунды t
печатается.
После того, как я обновляю эту ревизию, она решает результаты, поэтому я получаю 32 t
, напечатанный примерно через 1,5 минуты.
Я попытался с помощью следующих действий:
(defn unchunk [s]
(when (seq s)
(lazy-seq
(cons (first s)
(unchunk (next s))))))
К unchunk
данные не повезло.
Как обрабатывать эти обновления по мере их доступности ИЛИ существует ли более идиоматический способ записи infinite-updates
, чтобы обрабатывать все обновления по мере их поступления, не полагаясь на ленивый-seq?