Wolodja Wentland <[email protected]> writes:
>> --8<---------------cut here---------------start------------->8---
>> (defn concat-input-stream
>> "Gets one or many input streams and returns a new input stream that
>> concatenates the given streams."
>> ^java.io.InputStream [^java.io.InputStream is & more]
>> (proxy [java.io.InputStream] []
>> (read []
>> (let [input (.read is)]
>> (if (and (== -1 input) (seq more))
>> (.read (apply concat-input-stream (first more) (rest more)))
>> input)))))
>>
>> (def mystream (concat-input-stream (java.io.ByteArrayInputStream. (.getBytes
>> "ab"))
>> (java.io.ByteArrayInputStream. (.getBytes
>> "cd"))
>> (java.io.ByteArrayInputStream. (.getBytes
>> "ef"))))
>>
>
> Great! I think that I would eventually run into the problems detailed
> in http://tech.puredanger.com/2011/08/12/subclassing-in-clojure/ but
> thanks a lot for this inspiration.
Hm, probably yes. But you can implement the other arities quiet easily.
So that version also accepts the version that reads into a byte array.
The third version is left as an exercise for the reader. ;-)
--8<---------------cut here---------------start------------->8---
(defn concat-input-stream
"Gets one or many input streams and returns a new input stream that
concatenates the given streams."
^java.io.InputStream [^java.io.InputStream is & more]
(proxy [java.io.InputStream] []
(read
([]
(let [input (.read is)]
(if (and (== -1 input) (seq more))
(.read (apply concat-input-stream (first more) (rest more)))
input)))
([ary]
(loop [i 0]
(if (== i (alength ary))
i
(let [input (.read this)]
(if (== -1 input)
i
(do
(clojure.core/aset ary i (byte input))
(recur (inc i)))))))))))
(def mystream (concat-input-stream (java.io.ByteArrayInputStream. (.getBytes
"ab"))
(java.io.ByteArrayInputStream. (.getBytes
"cd"))
(java.io.ByteArrayInputStream. (.getBytes
"ef"))))
(let [ary (byte-array 6)
retval (.read mystream ary)]
(println (java.util.Arrays/toString ary))
retval)
; [97, 98, 99, 100, 101, 102]
;=> 6
--8<---------------cut here---------------end--------------->8---
Bye,
Tassilo
--
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