I have a function that is returning a lazy-seq of lazy-seq's.


(seq (seq [1 2 3]) (seq [4 5 6]) ...)


The end-user API, however, should be able to get back a lazy-seq of the 
individual items across all lazy-seq's--essentially a flattening of the 
output of my function--instead of the "top level" seqs. 


(seq [1 2 3 4 5 6 ...])

Each of the internal lazy-seq's is expensive in terms of memory usage so 
I'd like to only "load" one at a time.  I've been trying to find a way to 
only calculate one of the top-level lazy-seq's at a time and then not 
"take" the next until the user gets to the end of the first and needs the 
first item from the next (eg: (seq [4 5 6]) doesn't get calculated until we 
have consumed 3 and are asking for the next), but haven't found a way to do 
it. Best I've gotten is "loading" 2 "top level" seqs at a time and I'm 
afraid that may be the best I get, but I thought it might be an exercise 
worth presenting in case anyone had ideas. Here's a contrived example:


(defn lazy-flatten

 [coll]

 (when-let [s (seq coll)]

   (lazy-seq

     (if (seq? (first s))

       (concat (lazy-flatten (first s)) (lazy-flatten (rest s)))

       (cons (first s) (lazy-flatten (rest s)))))))

(->> (repeatedly
       (fn []
         (println "New seq...")
         (map (fn [x] + x (rand-int 10)) (range 4))))
     lazy-flatten
     (take 1))



Prints:


New seq...

New seq...

=> (8)


I realize this is because 2 items must be taken for "concat", so there 
would need to be another approach (this was just my best shot 
implementation). 


Any ideas on how to get the bottom form to only print 1 "New seq..."?

-- 
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
--- 
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to