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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.