(defn unfold ([grow seed] (lazy-seq (if-let [[elt next-seed] (grow seed)] (cons elt (unfold grow next-seed))))) ([grow finished? seed] (unfold #(when (not (finished? %)) (grow %)) seed)))
(unfold (fn [x] [(* x x) (inc x)]) #(> % 10) 0) (0 1 4 9 16 25 36 49 64 81 100) (unfold (fn [x] (when (<= x 10) [(* x x) (inc x)])) 0) (0 1 4 9 16 25 36 49 64 81 100) I think it can be proved that any sequence can be build with a call to unfold. Which makes it useful and solves the "why reduce is not lazy?" question. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en