Damn, just noticed a small mistake in the macro: I use the original buffer, not the duplicated one. Here's the correct version:
(defmacro buffer-reduce [b f val] `(let [b# (.duplicate ~b)] (loop [remaining# (.remaining b#) result# ~val] (if (zero? remaining#) result# (recur (dec remaining#) (~f result# (.get b#))))))) (extend-protocol clojure.core.protocols/CollReduce java.nio.ByteBuffer (coll-reduce [b f] (coll-reduce b f (f))) (coll-reduce [b f val] (buffer-reduce b f val)) java.nio.LongBuffer (coll-reduce [b f] (coll-reduce b f (f))) (coll-reduce [b f val] (buffer-reduce b f val)) ; ... other kinds of buffer ... ) Sorry for that. On Thursday, October 18, 2012 6:50:07 PM UTC-3, Bruno França dos Reis wrote: > > Hello! > > I've recently started playing with Clojure, and a couple of days ago I've > been pointed to Reducers in Clojure 1.5 after a discussion on #clojure at > Freenode. > > I've read Rich's posts announcing the Reducers library, and he says that > there's a ***lack of reducible IO sources***. I'm working on a project > that in which I analyze lots of data (from huge files on disk), and I'm > frequently doing "reduce" operations on it. I began by writing a custom > sequence, that after I transformed in a custom reducible collection. But > I've just noticed that I could encapsulate it on a kind of reducible IO > source. > > I'm writing this message to share the code I wrote relating to reducible > IO sources, if anybody sees any use for it. The idea is to make the ***NIO > Buffers reducible***, so that you can open huge files as **memory mapped > files**, which are instances of `ByteBuffer`. You can then obtain > instances of other buffers, say, `LongBuffer` (which is what I'm using on > my current project), which are also reducible: > > (defmacro buffer-reduce [b f val] > `(let [b# (.duplicate ~b)] > (loop [remaining# (.remaining b#) > result# ~val] > (if (zero? remaining#) > result# > (recur (dec remaining#) (~f result# (.get ~b))))))) > > (extend-protocol clojure.core.protocols/CollReduce > java.nio.ByteBuffer > (coll-reduce [b f] (coll-reduce b f (f))) > (coll-reduce [b f val] (buffer-reduce b f val)) > > java.nio.LongBuffer > (coll-reduce [b f] (coll-reduce b f (f))) > (coll-reduce [b f val] (buffer-reduce b f val)) > > ; ... other kinds of buffer ... > ) > > > Hope this might be useful for someone. > > Bruno > -- 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