Hi,
how about this?
(def sentence-spec {1 {:n 2 :fmt "[1] a=%d b=%d"}
4 {:n 0 :fmt "[4]"}
5 {:n 1 :fmt "[5] z=%d"}})
(defn input-reader
[inputQ eof?]
(fn [byteArray]
(.put inputQ (or byteArray eof?))))
(defn input-bytes
[inputQ eof?]
(->> (repeatedly #(.take inputQ))
(take-while #(not (identical? % eof?)))
(mapcat identity)))
(defn sentence-seq
[bytes-seq]
(lazy-seq
(when-let [s (seq bytes-seq)]
(let [{:keys [n fmt]} (sentence-spec (first s))
[sentence tail] (split-at n (rest s))]
(cons (apply format fmt sentence)
(sentence-seq tail))))))
(defn the-app
[]
(let [eof? (Object.)
inputQ (LinkedBlockingQueue.)]
(init-serial-port (input-reader inputQ eof?))
(sentence-seq (input-bytes inputQ eof?))))
It uses a guard to detect EOF (assuming a nil "array" means EOF) and turns
the input queue into a sequence of bytes. Then the translation to sentences
is based on this input byte sequence.
Sincerely
Meikel
--
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