I'm posting this on the off chance it's useful to those of you writing REPL 
shell tools or I/O abstractions (e.g. java's NIO.2 DirectoryStream 
wrappers) that might benefit from a close-when-GC'd backstop.

For example, clj-nio2 has a nice little lazy directory sequence function:

(defn- lazy-dir-stream-seq [^DirectoryStream dir-stream]
  (let [it (.iterator dir-stream)
        iter (fn thisfn []
               (if (.hasNext it)
                 (cons (.next it)
                       (lazy-seq (thisfn)))
                 (.close dir-stream)))]
    (lazy-seq (iter))))


However that will result in the stream being closed only if we reach the 
end of the directory stream.  
So I wrote the code in the referenced gist to address that problem, though 
I haven't hooked it up into my own or one of the existing NIO wrappers yet.

So FWIW.  And suggestions welcome.
I hate the bit of reflection I used but was having difficulty doing it any 
other way with PhantomReference instances.

https://gist.github.com/dtenny/9104215

Basically any open Closeable reference can be called in an (ensure-close 
<x>) fashion to make sure it gets closed eventually,
as my exhaustive (NOT!) test case at the end shows (file content gets 
flushed).

It's very side effect-y, I feel so dirty...  Bad java followed by worse 
clojure.   Tips welcome.  It was just a clojure learning thing for me.

-- 
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/groups/opt_out.

Reply via email to