;; a lazy generator walking backwards: rseq hands
;; out a vector's elements from the end at once,
;; while reverse has to build a new collection
(defn rev-gen [data]
(rseq (vec data)))
(doseq [c (rev-gen "string")]
(println c))
;; printed g, n, i, r, t, s
(doseq [i (rev-gen [1 2 3])]
(println i))
;; printed 3, 2, 1
;; range counts down lazily too
(println (vec (range 3 0 -1)))
;; [3 2 1]
;; and iterate makes an endless countdown
(println (take 5 (iterate dec 10)))
;; (10 9 8 7 6)