On Mon, Apr 28, 2014 at 12:30:00AM +1000, Peter B. West wrote: > I have no ambitions to solve the general problem; just to find a > workable solution for my own use.
What is your own use? Your current solution involves using a shared
global variable to communicate between two functions, and tying up a
thread to wait to close a file handle. Both of these issues I consider
to be "unworkable".
There are other ways to manage resource scope, though. For instance, you
could have your "lazy-lines" function return a lazy-sequence which will
close the file on completely reading the stream:
(defn lazy-lines [resource]
(let [r ^java.io.Reader (vcf-res-reader resource)
close #(.close r)]
(concat (line-seq r)
(lazy-seq (close)))))
Or one which provides you a function to close the stream when you want
to:
(defn lazy-lines [resource]
(let [r ^java.io.Reader (vcf-res-reader resource)
close #(.close r)]
(with-meta (line-seq r)
{:close close})))
Or one which does both:
(defn lazy-lines [resource]
(let [r ^java.io.Reader (vcf-res-reader resource)
close #(.close r)]
(with-meta (concat (line-seq r)
(lazy-seq (close))) ;; close if we're done
{:close close}))) ;; also provide the close function externally
None of these options mutate any global, shared memory. They all return
a sequence directly to the caller, and none of them require any sort of
coordination with other threads.
signature.asc
Description: Digital signature
